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

问题描述

| 给定一个具有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]; // 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);
    

解决方法

        我猜,最好的选择是遍历各个键,然后根据这些键进行推送。这样一来,您就可以避免基本上需要进行一连串的字符串查找的过程-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 ] ] );
    ,        不要使用
for .. in ..
,它会很慢并且会带来问题。只需使用
for
循环即可。 你为什么只深入三层?在您的示例中,您有一个包含4的集合。我希望有一些递归解决方案。 至于您的问题:这是最有效的方法吗? 如果您确实在寻找最有效的方法,则可能会为每个浏览器使用不同的脚本(或更确切地说是JavaScript引擎)。 我将重点放在有效的实现上,因为我认为它甚至现在都没有这样做。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...