2014-09-10 79 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);