2014-09-10 82 views
0

我有以下的数组:如何找到元件的所有组合中的JavaScript数组

[[A,1,X],[B,2,Y],[C,3,Z]]

我希望能够获得每个子数组的第一个索引的所有组合,然后循环执行每个组合上执行单个任务的组合。所以这些就是我之后的组合(注意我需要同样值的组合):

[[A,A],[A,B],[A,C],[B,A ],[B,B],[B,C],[C,A],[C,B],[C,C]

然后我会循环通过,值。

我不确定从哪里开始,所以任何建议或指针都会非常有帮助!

回答

0

试试这个:

var data = [['A',1,'X'],['B',2,'Y'],['C',3,'Z']]; 

function getCombinations(data) { 
    var combinations = []; 
    data.forEach(function(first) { 
     data.forEach(function(second) { 
      combinations.push([first[0], second[0]]); 
     }); 
    }); 
    return combinations; 
} 

console.log(getCombinations(data)); 

这里是jsfiddle-demo

1

你需要通过数组有效循环两次。根据你想你可以只是每次静态访问的第一个元素是什么:

var arr = [['A',1,'X'],['B',2,'Y'],['C',3,'Z']]; 
var newArr = []; 
var length = arr.length; 
var curr; 

for (var i = 0; i < length; i++) { 
    curr = arr[i][0]; 

    for (var j = 0; j < length; j++) { 
     newArr.push([curr, arr[j][0]]); 
    } 
} 

console.log(newArr); 

Fiddle

0

让我们分解的问题。首先,让我们提取每个子阵列的第一个元素的方式进行:

function get_elts(data, idx) { 
    return data.map(function(v) { return v[idx]; }); 
} 

所以

> get_elts(data, 0) // ['A', 'B', 'C'] 

将问题分解像这样的好方案设计的基础。我们不想编写混杂了多个问题的东西。在这种情况下,多个问题是(1)获得每个子阵列的第一个元素和(2)找到组合。如果我们编写一个混合这两个问题的例程,那么我们将永远无法将它重用于其他事情。如果我们的老板出现并且现在说他想要找到每个子阵列的第二个元素的所有组合,我们将不得不剪切并粘贴并创建几乎重复的代码。然后,我们将在我们剩余的生命中保留该代码,或者至少在我们退出之前。关于保理的规则是尽快而不是迟。

然后,创建任意两个阵列的所有组合:

function combinations(arr1, arr2) {  //create all combos of elts in 2 arrays by 
    return [].concat.apply(    //concatenating and flattening 
     [],        //(starting with an empty array) 
     arr1.map(      //a list created from arr1 
      function(v1) {    //by taking each elt and from it 
       return arr2.map(  //creating a list from arr2 
        function(v2) {  //by taking each element and from it 
         return [v1, v2]; //making a pair with the first elt 
        } 
       ); 
      }; 
     ) 
    ); 
} 

通常我们会这种更紧凑写。让我们通过它:

  1. Array#concat结合一个或更多的事情,还是那些东西中的元素,如果他们是数组,到一个数组。
  2. Function#apply让我们提供一个数组,它将变成参数列表concat
  3. Array#map创建一个平行阵列arr1,其中包含...
  4. 元件,其是基于遍历arr2两元件阵列。

对,这不是你母亲的JavaScript。它几乎与你初始化这种风格的风格不同,它设置并循环播放其他内容并返回其他内容。通过采用这种风格,我们最终得到的代码更精确,简洁,可重复使用,证明正确,未来友好,并且可能优化。通过对未来友好,我的意思是除了其他方面ES6友好的。以上可以改写为:

combinations = (arr1, arr2) => [].concat(...arr1.map(v1 => arr2.map(v2 => [v1, v2]))); 

准备好男人和女孩,这会很快出现在你的求职面试中。现在是时候从jQuery开始。

现在的问题可以表示为:

var first_elts = get_elts(data, 0); 
combinations(first_elts, first_elts);