找到对象中3个键的所有组合

时间:2011-06-11 23:37:20

标签: javascript math

给定一个带有 n 键的对象,需要找到每3个键的所有组合( nC3 在数学中)

这是最有效的方法吗?

var x = {};  // object

x['00'] = [1, 7, 9];
x['01'] = [1, 9];
x['02'] = [6, 8];
x['03'] = [1, 7];
x['04'] = [1, 5, 8];
x['05'] = [4, 6, 8, 9];

var triples = [],
    c = [0,0,0]; // counter. keep track of the indexes when looping over objects

for(var i in x){
    c[0]++;
    c[1] = 0;

    for(var j in x){ // loop to compare this x[i] array to all other arrays
        c[1]++;
        if( c[1] < c[0]+1 ) continue;
        c[2] = 0;

        for(var k in x){
            c[2]++;
            if( c[2] < c[1]+1 ) continue;

            triples.push( [i,j,k] );
        }
    }
}

console.dir(triples);

2 个答案:

答案 0 :(得分:2)

根据我的猜测,你最好的选择是迭代键,然后根据它进行推送。这样你就可以避免基本上相当于一系列String查找的东西 - 这些JS通常很擅长,但不像简单的数字迭代那么快。

这将是这样的:

var keys = []
for( var it in x ) keys.push(it);

var triples = []
var len = keys.length; //cache the value.
for( var i = 0; i < len; i++ )
   for( var j = i + 1; j < len; j++ )
      for( var k = j + 1; k < len; k++ )
         triples.push( [ keys[ i ], keys[ j ], keys[ k ] ] );

答案 1 :(得分:0)

不要使用for .. in ..,它很慢并且会产生问题。只需使用for循环。

你为什么只走3深?在你的例子中,你有一个4的集合。我希望有一些递归的解决方案。

关于你的问题:这是最有效的方法吗?

如果您真的在寻找最有效的方法,那么您可能会为每个浏览器(或精确的JavaScript引擎)使用不同的脚本。

我专注于一个有效的实施,因为我认为它现在没有做到这一点。