首页 > 解决方案 > 将具有相同键的数组元素加在一起?

问题描述

我有一系列按每种货币(钞票,硬币)组织的钱。一些纸币和硬币出现多次。有没有办法通过数组删除重复的货币类型并将货币值加在一起?

我当前的数组:

register.change = [[TEN,10],[QUARTER,0.25],[QUARTER,0.25],[QUARTER,0.25],[DIME,0.1],[DIME,0.1],[PENNY,0.01],[PENNY,0.01],[PENNY,0.01],[PENNY,0.01]]

最终结果:

register.change = [[TEN,10],[QUARTER,0.75],[DIME,0.2],[PENNY,0.04]

标签: javascriptarrays

解决方案


使用对象来存储键值对。循环遍历数组,并为每一对,将值添加到键的前一个值(如果存在)。这是长篇的基本思想:

var obj = {};
for (var i = 0; i < change.length; i++) {
  if (change[i][0] in obj) {
    obj[change[i][0]] += change[i][1];
  } else {
    obj[change[i][0]] = change[i][1];
  }
}

这可以使用reduce(并使用 ES6 语法)大大简化:

var obj = change.reduce((acc, [key, val]) => (acc[key] = (acc[key] || 0) + val, acc), {});

然后只需将该结果传递给以Object.entries将其转回键值对数组。

把它放在一起:

const TEN = 'TEN';
const QUARTER = 'QUARTER';
const DIME = 'DIME';
const PENNY = 'PENNY';
const change = [[TEN,10],[QUARTER,0.25],[QUARTER,0.25],[QUARTER,0.25],[DIME,0.1],[DIME,0.1],[PENNY,0.01],[PENNY,0.01],[PENNY,0.01],[PENNY,0.01]];

const output = Object.entries(change.reduce((a, [k, v]) => (a[k] = (a[k] || 0) + v, a), {}));
console.log(output);


推荐阅读