繁体   English   中英

遍历属性对

[英]Iterate through pairs of properties

给定一个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循环中使用double 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 ... in的对象,但是您每次都可以删除一个键,这将使它总共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
});

在小提琴中测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM