2013-06-28 104 views
1

我有2個陣列,條件合併2個二維陣列

arr1 = [ 
    ['itemid-1', 'itemclass', 'timestamp'], 
    ['itemid-2', 'itemclass', 'timestamp'], 
    ['itemid-3', 'itemclass', 'timestamp'], 
    ['itemid-5', 'itemclass', 'timestamp'] 
]; 

arr2 = [ 
    ['itemid-1', 'data-state', 'data-col'], 
    ['itemid-3', 'data-state', 'data-col'], 
    ['itemid-4', 'data-state', 'data-col'] 
]; 

最終的結果應該是:

arr1 = [ 
    ['itemid-1', 'itemclass', 'timestamp', 'data-state', 'data-col'], 
    ['itemid-2', 'itemclass', 'timestamp'], 
    ['itemid-3', 'itemclass', 'timestamp', 'data-state', 'data-col'], 
    ['itemid-5', 'itemclass', 'timestamp'] 
]; 

我想從arr2合併值arr1其中itemid-x相同。

我可以通過使用循環做到這一點,

for(i = 0; i < arr1.length; i++){ 
    for(j = 0; j < arr2.length; j++){ 
     if(arr1[i][0] == arr2[j][0]){ 
      arr1[i] = arr1[i].concat(arr2[j].slice(1)); 
     } 
    } 

} 

但是我最近開始與underscorejs和的NodeJS,所以我想知道,如果它可以與任何現有的功能來完成。

PS:我發現this answer有趣,但它需要數組的長度相同,如果兩個數組中的itemid-x索引不相同,它也不起作用。

+0

所以你的代碼的作品,你只是想找一個更好的方法來做到這一點? – Patashu

+0

是的當然,我也已經在使用下劃線,並且不介意添加其他庫。 –

+1

您的代碼使用原生JavaScript功能。恕我直言,你不需要任何東西,只需使用它。 –

回答

1

我不知道它是否真的使事情看起來更好或更容易理解,但你可以做

arr1.forEach(function(v, i){arr2.filter(function(v2){return v[0]==v2[0]}).forEach(function(v3){v3.slice(1).forEach(function(e){v.push(e)})})}); 

這肯定看起來更像JS。 ;)

我認爲有這麼多不同的數據結構和用例,你不能真正從你的數據結構中派生出一個常見的情況。元素[0]在某種程度上是特殊的,但是這反映在你的代碼中,而不是在數據結構中。

對於您認爲有意思的答案,您可以重構您的數據嗎? arr2 = { itemid-1: [ ... ], itemid-2: [ ... ] }。然後你可以做一個forEach循環,一個簡單的查找和concat:arr1[i].concat(arr2[v])

+0

謝謝,我也最終將arr2更改爲對象。 –

1

你的代碼工作正常,但你可以改進這一點。由於您使用的是排序數組,因此不需要兩個循環,它們使用迭代次數爲m*n。你可以這樣做m+n迭代合併兩個數組,其中m = arr1.length和n = arr2.length

var i = j = 0; 
var answer = []; 

while (i < arr1.length && j < arr2.length) 
{ 
    arr1ptr = arr1[i][0]; // Just for checking index 
    arr2ptr = arr2[j][0]; // You can extract 'id' if you want 

    if (arr1ptr == arr2ptr) 
    { 
     answer.push(arr1[i].concat(arr2[j].slice(1))); 
     i++; 
     j++; 
    } 
    else if (arr1ptr < arr2ptr) 
    { 
     answer.push(arr1[i]); 
     i++; 
    } 
    else if (arr1ptr > arr2ptr) 
    { 
     answer.push(arr2[j]); 
     j++; 
    } 
} 

它比你的線,但是它更快。根據您使用的陣列的大小和編碼的難易程度,您可能需要使用它。

+0

這很好,但數組並不總是排序(也必須保留索引)。我的榜樣可能導致人們相信道歉。如果不匹配,我又想從arr1中獲取元素,而應該丟棄arr2元素。爲此,我會改變'else if(arr1ptr