【问题标题】:To add quantities of similar objects in an array javascript (ES5) [duplicate]在数组javascript(ES5)中添加大量类似对象[重复]
【发布时间】:2016-12-10 12:18:51
【问题描述】:

我有一个这样的数组:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

我希望结果是对同一 catNumber 的所有数量求和。

var  data = [
    { catNumber: 'EK-21200', quantity: 15},
    { catNumber: 'EK-00341', quantity: 10}
];

【问题讨论】:

  • catNumber 是修复还是更多??
  • 没有。可以有“n”个 catNumber。因此,它应该是相似 catNumbers 数量的总和。

标签: javascript arrays loops object ecmascript-5


【解决方案1】:

你可以使用这个 ES6 代码:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

data = Array.from(data.reduce( (acc, {catNumber, quantity}) => 
    acc.set(catNumber, (acc.get(catNumber) || 0) + quantity),
    new Map()
), ([catNumber, quantity]) => ({catNumber, quantity}) );

console.log(data);

或者,在 ES5 版本中:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

var acc = data.reduce( function(acc, obj) {
    acc[obj.catNumber] = (acc[obj.catNumber] || 0) + obj.quantity;
    return acc;
}, {});
data = Object.keys(acc).map(function(key) {
    return { catNumber: key, quantity: acc[key] };
});

console.log(data);

最后,这是一个不使用reducemap等Array迭代方法的版本,而是使用for循环代替:

var  data = [
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-21200', quantity: 5},
    { catNumber: 'EK-00341', quantity: 5}
];

var acc = {};
for (var i = 0; i < data.length; i++) {
    var obj = data[i];
    if (!acc[obj.catNumber]) acc[obj.catNumber] = 0;
    acc[obj.catNumber] += obj.quantity;
}
data = [];
for (var key in acc) {
    data.push({ catNumber: key, quantity: acc[key] });
}

console.log(data);

【讨论】:

  • 感谢您的回答。但我正在使用 ES5。我目前无法像现在一样更改项目的版本。如果我采用 ES5 格式,这将很有帮助。
  • 我添加了相同的ES5版本。
  • 我刚开始接触 JS。多学习多练习。感谢您的解决方案。
  • 好的,我添加了另一个可能更容易理解的代码变体。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多