当前位置: 代码迷 >> JavaScript >> 将具有相同键的数组元素加在一起吗?
  详细解决方案

将具有相同键的数组元素加在一起吗?

热度:57   发布时间:2023-06-13 12:43:22.0

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

我当前的数组:

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]

保留一张包含硬币名称以及您第一次偶然发现该硬币的索引的地图。 硬币的名称是关键,而索引是值。 例如,原始数组中的第一个元素是一角钱,因此请在地图上输入键“ dime”和值0。

继续遍历原始数组,检查每个元素,是否已经看到了这种类型的硬币(如果地图中存在)。 如果是,则取当前元素的数量,将其添加到该键在映射中存储的索引值中存在的元素中(因为您之前已经看到过这种类型的硬币),然后从数组。

如果没有,只需将键值添加到地图并继续。

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

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];
  }
}

使用 (和使用ES6语法)可以大大简化此操作:

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

然后只需将结果传递给即可将其返回到键值对数组。

把它放在一起:

 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); 

你可以简单地使用减少

var data = [['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]];

    Object.values(data.reduce((a, c)=>{
        if(!a.hasOwnProperty(c[0])) { a[c[0]] = [c[0], 0]; }
        a[c[0]][1] += c[1];
        return a;
    }, {}));
  相关解决方案