Javascript合并2个数组并对相同的键值求和
我有两个数组:Javascript合并2个数组并对相同的键值求和,javascript,arrays,merge,sum,Javascript,Arrays,Merge,Sum,我有两个数组: var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]]; var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]]; 想要得到1个合并数组,其中包含对应键的和 var array1 = [[1,10],[2,10],[3,10],[4,10],[5,50],[6,50],[7,10],[8,10],[9,10]]; 两个数组都有唯一的键,但需要求和相应的
var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];
想要得到1个合并数组,其中包含对应键的和
var array1 = [[1,10],[2,10],[3,10],[4,10],[5,50],[6,50],[7,10],[8,10],[9,10]];
两个数组都有唯一的键,但需要求和相应的键
我尝试了循环、concat等,但没有得到我需要的结果
以前有人这样做过吗?您可以使用.reduce()
传递跟踪找到的集合的对象,并进行添加
演示:
如果需要对结果进行排序,请将其添加到末尾:
.sort(function(a,b) {
return a[0] - b[0];
})
试试这个:
var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];
var res = [];
someReasonableName(array1, res);
someReasonableName(array2, res);
function someReasonableName(arr, res) {
var arrLen = arr.length
, i = 0
;
for(i; i < arrLen; i++) {
var ar = arr[i]
, index = ar[0]
, value = ar[1]
;
if(!res[index]) {
res[index] = [index, 0];
}
res[index][1] += value;
}
}
console.log(JSON.stringify(res, null, 2));
因此,您可以:
var holesRemoved = compact(res);
最后,如果您不想要0
th元素res
。Dores.shift()代码>
免责声明:我不擅长给出合理的名称。这是一种方法:
var sums = {}; // will keep a map of number => sum
// for each input array (insert as many as you like)
[array1, array2].forEach(function(array) {
//for each pair in that array
array.forEach(function(pair) {
// increase the appropriate sum
sums[pair[0]] = pair[1] + (sums[pair[0]] || 0);
});
});
// now transform the object sums back into an array of pairs
var results = [];
for(var key in sums) {
results.push([key, sums[key]]);
}
可以使用[].map()对短例程进行编码
我喜欢它只需要3行代码,不需要任何内部函数调用,如push()或sort(),甚至不需要if()语句。简单的解决方案如下。
function sumArrays(...arrays) {
const n = arrays.reduce((max, xs) => Math.max(max, xs.length), 0);
const result = Array.from({ length: n });
return result.map((_, i) => arrays.map(xs => xs[i] || 0).reduce((sum, x) => sum + x, 0));
}
console.log(...sumArrays([0, 1, 2], [1, 2, 3, 4], [1, 2])); // 2 5 5 4
也许你可以向我们展示你认为最接近预期的尝试。你的代码在这种情况下似乎不起作用,你能检查一下吗@Sachin:GIGO,小提琴中的数组不包含你可能认为的内容:是的,我知道,但如果我在第一个索引中放入任何两个或更多的数字值,它也不起作用。看一看
var sums = {}; // will keep a map of number => sum
// for each input array (insert as many as you like)
[array1, array2].forEach(function(array) {
//for each pair in that array
array.forEach(function(pair) {
// increase the appropriate sum
sums[pair[0]] = pair[1] + (sums[pair[0]] || 0);
});
});
// now transform the object sums back into an array of pairs
var results = [];
for(var key in sums) {
results.push([key, sums[key]]);
}
var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];
array1=array2.concat(array1).map(function(a){
var v=this[a[0]]=this[a[0]]||[a[0]];
v[1]=(v[1]||0)+a[1];
return this;
},[])[0].slice(1);
alert(JSON.stringify(array1));
//shows: [[1,10],[2,10],[3,10],[4,10],[5,50],[6,50],[7,10],[8,10],[9,10]]
function sumArrays(...arrays) {
const n = arrays.reduce((max, xs) => Math.max(max, xs.length), 0);
const result = Array.from({ length: n });
return result.map((_, i) => arrays.map(xs => xs[i] || 0).reduce((sum, x) => sum + x, 0));
}
console.log(...sumArrays([0, 1, 2], [1, 2, 3, 4], [1, 2])); // 2 5 5 4