迭代属性对

Iterate through pairs of properties

本文关键字:属性 迭代      更新时间:2023-09-26

给定一个JS对象:

var obj = {
    p1: "v1",
    p2: "v2",
    ...,
    pn: "vn"
}

我想做的是获得一个遍历所有不同的属性对的迭代器(名称或值对我来说都可以)。

所以我可以有这样一个函数:
function(va, vb) {
    // do something with every pair
}

在对集合("v1", "v2"), ("v1", "v3"),…, ("v1", "vn"), ("v2", "v3"),…, ("v2", "vn"),…, ("vn-1", "vn")(共n(n - 1)/2次)

简单的解决方案是使用双for ... in循环并丢弃其中的重复,但这既不快速也不优雅。

如果是数组而不是对象,则可以进行不同类型的迭代,如:

var len = obj.length;
for (var i = 0; i < len - 1; i++) {
    for (var j = i + 1; j < len; j++) {
        // do something with obj[i], obj[j]
    }
}

但是我不知道有什么方法可以像这样迭代一个对象(或者它是否有意义!)。

那么,在javascript(或jQuery)中是否有任何快速而优雅的方法来做到这一点?

编辑:

我不想得到一个(键,值)的迭代器在一些答案中建议。我想要一个遍历对象中属性对的迭代器。

例如,我想运行一个检查,验证每个值与任何其他值的距离最多为10个单位。

function checkIsClose(v1, v2) {
    return ((v1 - v2) < 10 && (v1 - v2) >= 0)) || ((v2 - v1) < 10 && (v2 - v1) >= 0);
}

试试这个,演示

var obj = {
    p1: "v1",
    p2: "v2",
    pn: "vn"
}
$.each(obj, function(a, b){alert(a);alert(b)});
更新:

$.each(obj, function(a, b1){
  $.each(obj, function(a, b2){
    console.log(b1 +" ,"+ b2);
  })
});

演示输出:

("v1", "v2"), ("v1", "v3"), ... , ("v1", "vn"), ("v2", "v3"), ... , ("v2", "vn"), ... , ("vn-1", "vn"). (A total of n(n - 1)/2 times)
https://api.jquery.com/jQuery.each/

我想不出像这样迭代对象的其他方法,而不是for…在。但是你可以每次删除一个键,这将使它总共n(n - 1)/2次。

http://jsfiddle.net/XiozZe/YTVAL/

var obj = {
    p1: "v1",
    p2: "v2",
    p3: "v3",
    p4: "v4",
    p5: "v5",
    p6: "v6",
}
//duplicate obj
var obj2 = {}
for (var i in obj) {
    obj2[i] = obj[i];
}
for(var i in obj2){
    for(var j in obj2){
        // do something with obj[i], obj[j]
    }
    delete obj2[i];
}
//obj2 is now empty

执行jQuery.map():

jQuery.map(obj, function(vb, va) {
    // do something with every pair
});

在提琴中测试