说我有这样的二维数组:
[[1,4], [1,3], [2,4], [6,4], [2,5]]
我想合并内部数组,以便那些共享相同第一个元素的数组将通过对第二个元素求和来得到一个数组。所以这个例子的输出是:
[[1,7], [2,9], [6,4]]
在javascript中执行此操作的最佳方法是什么?我可以使用underscore.js
答案 0 :(得分:1)
使用临时对象:
var a = [[1,4], [1,3], [2,4], [6,4], [2,5]]
var o = {};
a.forEach(function(e) {
if (o[e[0]]) {
o[e[0]] += e[1];
} else {
o[e[0]] = e[1];
}
});
var res = Object.keys(o).map(function(k){
return [+k, o[k]];
});
document.write(JSON.stringify(res));
答案 1 :(得分:0)
在ES6中,您可以使用地图:
var arr = [[1,4], [1,3], [2,4], [6,4], [2,5]],
map = new Map();
for(let [key,val] of arr)
map.set(key, (map.get(key) || 0) + val);
[...map]; // [[1,7], [2,9], [6,4]]
答案 2 :(得分:0)
你可以减少"数组到一个对象,第一个值是属性,第二个值聚合为,值,而不是将此对象转回数组:
var obj = arr.reduce(function(r, curr){
r[curr[0]] = (r[curr[0]] || 0) + curr[1];
return r;
}, {});
var newArr = Object.keys(obj).map(function(k) {
return[k, obj[k]];
});
答案 3 :(得分:0)
使用Array.forEach
方法和自定义keyMap
对象的解决方案:
var arr = [[1,4], [1,3], [2,4], [6,4], [2,5]], keyMap = {}, result = [];
arr.forEach(function(v){
var prop = 'key' + v[0];
(!(prop in keyMap))? keyMap[prop] = v[1] : keyMap[prop] += v[1];
});
for (var k in keyMap) {
result.push([parseInt(k[3]), keyMap[k]]);
}
console.log(result); // [[1,7], [2,9], [6,4]]