[英]javascript - merging arrays with like elements
说我有一个像这样的二维数组:
[[1,4], [1,3], [2,4], [6,4], [2,5]]
我想合并内部数组,以便那些共享相同第一个元素的数组将通过合计第二个元素而成为一个数组。 因此,此示例的输出为:
[[1,7], [2,9], [6,4]]
用javascript执行此操作的最佳方法是什么? 我可以使用underscore.js
使用临时对象:
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));
在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]]
您可以将数组“缩减”为一个对象,其第一个值为属性,第二个值聚合为值,然后将该对象返回数组:
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]];
});
使用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]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.