我有两个阵列,
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:我发现这个答案很有趣,但它要求数组的长度相同,而且如果两个数组中的itemid-x
索引不相同,它也不会起作用。
我不知道它是真的让事情看起来更好还是更容易理解,但你可以做
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])
?
您的代码运行良好,但您可以对此进行改进。由于您使用的是排序数组,因此不需要两个循环,它们使用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++;
}
}
它的线路比你的多,但速度更快。根据您使用的数组的大小和编码的容易程度,您可能需要使用它。