条件合并2个二维数组

时间:2013-06-28 05:49:48

标签: javascript arrays node.js underscore.js

我有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']
];

我想合并arr2arr1的值,其中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索引在两个数组中都不相同,它也不会起作用。

2 个答案:

答案 0 :(得分: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++;
    }
}

它拥有比你更多的线条,但速度更快。根据您使用的阵列大小和编码的简易性,您可能希望使用它。

答案 1 :(得分: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。 ;)

我认为有太多不同的数据结构和用例,您无法从数据结构中获得常见的案例。 element [0]在某种程度上是特殊的,但这反映在您的代码中,而不是数据结构中。

对于您觉得有趣的答案中考虑的问题,您可以重组数据吗? arr2 = { itemid-1: [ ... ], itemid-2: [ ... ] }。然后你可以做一个forEach循环,一个简单的查找和一个concat:arr1[i].concat(arr2[v])