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

时间:2019-02-14 22:35:41

标签: javascript arrays

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

我当前的数组:

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]

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您可以简单地使用reduce

 1. php artisan tinker
 2. Schema::drop('your_table_name')
 3. php artisan migrate