2013-06-28 77 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