如何遍历对象中所有唯一的条目对?

Eri*_*ric 4 javascript iteration javascript-objects

我目前有一个像这样迭代的数组数据结构,调用foo每个唯一的元素对。

for(var i = 0; i < arr.length; i++) {
    for(var j = i + 1; j < arr.length; j++) {
        foo(arr[i], arr[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我意识到我宁愿使用对象而不是数组,因为这样我就可以很轻松地按名称添加和删除元素。

但是,我看不到迭代此类对象的明显方法。我能得到的最接近的是:

for(i in obj) {
    for(j in obj) {
        foo(obj[i], obj[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这将使每对执行两次,甚至产生一对相同的元素。是否有一种简单的方法可以像在第一个代码示例中的数组中那样迭代对象?

更新:

jsperf上的解决方案进行性能测试。

Sim*_*erg 5

我最初写为评论的解决方案:

if (i < j)在内部循环中添加一个条件。它可能不是最好的解决方案,但是只要foo函数对foo(2, 10)和执行相同的操作,它将起作用foo(10, 2)

for(i in obj) {
    for(j in obj) {
        if (i < j) {
            foo(obj[i], obj[j]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)