给定一个带有 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);
答案 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引擎)使用不同的脚本。
我专注于一个有效的实施,因为我认为它现在没有做到这一点。