【发布时间】:2012-05-17 07:56:06
【问题描述】:
我目前有一个数组数据结构,我像这样迭代它,在每对唯一的元素上调用 foo。
for(var i = 0; i < arr.length; i++) {
for(var j = i + 1; j < arr.length; j++) {
foo(arr[i], arr[j]);
}
}
但是,我意识到我宁愿使用对象而不是数组,因为这样我可以很容易地按名称添加和删除元素。
但是,我看不到迭代此类对象的明显方法。我能得到的最接近的是:
for(i in obj) {
for(j in obj) {
foo(obj[i], obj[j]);
}
}
显然,这将对每一对执行两次,甚至会产生一对相同的元素。有没有一种简单的方法可以像我在第一个代码示例中的数组中那样迭代对象?
更新:
在jsperf 上测试解决方案的性能。
【问题讨论】:
-
在内循环中添加
if (i < j)条件怎么样?这不是最快的解决方案,但我相信它可以工作。 -
@elclanrs:我不是在递归迭代——我是在迭代对象/数组中所有可能的条目组合。例如,在数组
[1, 2, 3]中,我想调用foo(1, 2)、foo(1, 3)和foo(2, 3)。 -
@SimonAndréForsberg 这在每种情况下都不起作用,因为对象的键不必排序,它们也不必是相同的数据类型。
-
@Eric 你是对的。但是字符串(对象键)与整数(数组键)的比较方式不同(例如,“10”
-
@Jasd:不,数组键也是字符串。尝试使用数组执行
for ... in循环。你得到的键不是整数,而是字符串。
标签: javascript iteration javascript-objects