这是相对简单的,但我无法找到更优雅的解决方案。
假设你有一个n维数组数组,你只想通过某种方法把匹配mth元素的数组挤压在一起,比如说加法。
示例:[[1, 100], [1, 200], [2, 100], [2, 105], [3, 202], [4, 133]]
结果:[[1, 300], [2, 205], [3, 202], [4, 133]]
我想出的解决办法对我来说真的不雅观有没有办法用更少的代码,或者更有效的方法来实现这一点?
function mergePairs(originalArray) {
const newArray = [];
originalArray.forEach((pair) => {
const foundPair = newArray.find((newPair) => {
return newPair[0] === pair[0];
});
if (foundPair) {
foundPair[1] += pair[1];
} else {
newArray.push(pair);
}
});
return newArray;
}
旁白:如果在Lodash有一个厚颜无耻的班轮,以一种超低效的方式完成同样的事情,我也很高兴。
最佳答案
您可以为您的特定案例使用reduce
和map
:
function mergePairs (originalArray) {
const o = originalArray.reduce((a, e) => (a[e[0]] = ~~a[e[0]] + e[1]) && a, {});
return Object.keys(o).map(k => [+k, o[k]]);
}
console.log(mergePairs ([[1, 100], [1, 200], [2, 100], [2, 105], [3, 202], [4, 133]]))