给出一个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);
}
答案 0 :(得分:3)
试试这个, Demo
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)
答案 1 :(得分:2)
我想不出另一种方法来迭代这样的对象而不用... 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
答案 2 :(得分:0)
像这样去jQuery.map():
jQuery.map(obj, function(vb, va) {
// do something with every pair
});