假设我有两个数组
var a = [[1, 10], [2, 10], [3, 10], [4, 10], [5, 10]];
var b = [[1, 20], [3, 20], [4, 20]];
我想把这两个组合成一个新的数组:
var c = [[1, 10, 20], [2, 10], [3, 10, 20], [4, 10, 20], [5, 10]];
做这件事最好的方法是什么?我马上就会把我的问题更新为我所尝试做的事情。
var c = [];
for(var i = 0; i < a.length; i++) {
for(var j = 0; j < b.length; j++) {
if(a[i][0] == b[j][0]) {
// Push b value into a
a[i][0].push(b[j][1]);
} else {
// Don't do anything...
}
}
}
c = a; // Useless code here but just wanted to return c
return c;
示例
var a = [[1, 10], [2, 10], [3, 10], [4, 10], [5, 10]];
var b = [[1, 20], [3, 20], [4, 20]];
var c = [];
// Loop over a
for (var n = 0; n < a.length; n++) {
// Create copy of a's value
var subA = a[n].slice(0);
// Loop over b
for (var i = 0; i < b.length; i++) {
var subB = b[i];
// Check if a contains b
if (subA.indexOf(subB[0]) === 0) {
// Add b to new a value
subA.push(subB[1]);
}
}
// Add new value to c
c.push(subA);
}
console.log(a)
console.log(c);
编辑1:更新for loop
编辑2:如果第一项等于第一项
编辑3:切片a保留原始值
为什么不使用普通数组呢?它们可以是稀疏的。
var a = [10, 10, 10, 10, 10];
var b = [20, , 20, 20];
现在把它们放到一个数组中:
var c = new Array(Math.max(a.length, b.length));
for (var i=0; i<c.length; i++)
if (i in a && i in b)
c[i] = [a[i], b[i]];
else if (i in a)
c[i] = [a[i]];
else if (i in b)
c[i] = [b[i]];
对于对象(条目不一定是数组)由非整数索引值组成的情况,可以在两个排序的列表上使用简单的标准合并算法。它将在O(n+m)
中运行,而不是在O(n*m)
中运行。有关示例实现和更多指针,请参阅此答案。