【问题标题】:Merging objects by property, accumulating another property in node按属性合并对象,在节点中累积另一个属性
【发布时间】:2018-10-10 17:11:33
【问题描述】:

获取以下对象数组并按键组合并累积价格的最佳方法是什么:

var sales = [
{
    order_id: 138,
    price: 25,
},
{
    order_id: 138,
    price: 30,
},
{
    order_id: 139,
    price: 15,
},
{
    order_id: 131,
    price: 25,
}, 

];

变成这样:

var sales = [
    {
        order_id: 138,
        price: 55,
    },
    {
        order_id: 139,
        price: 15,
    },
    {
        order_id: 131,
        price: 25,
    }, 
];

请注意,初始数组将包含 500 多个项目。这是减少的一个很好的用例吗?还是我需要用 for 循环构建一个全新的数组?

【问题讨论】:

  • 您想要的格式不是起始格式都是无效的——您有一个具有多个键的对象。那应该是一个数组吗?
  • 我想你想映射/减少(它应该是一个很好的谷歌搜索关键字);)但正如大家所说,这里没有数组!
  • 这没有任何意义。 item 键重复。对象不能有重复的键。
  • 抱歉,我混淆了我的语法。我想我现在已经编辑它是正确的。现在这个问题更有意义了吗?

标签: javascript arrays ecmascript-6 javascript-objects


【解决方案1】:
var sales = [
{
    order_id: 138,
    price: 25,
},
{
    order_id: 138,
    price: 30,
},
{
    order_id: 139,
    price: 15,
},
{
    order_id: 131,
    price: 25,
}, 
];

var buf = {}

sales.map(obj => {
    if(buf[obj.order_id]) {
        buf[obj.order_id].price += obj.price
    } else {
        buf[obj.order_id] = obj
    }
})

var result = Object.values(buf)
console.log(result)

【讨论】:

  • 谢谢! - 我最终对 .reduce() 和 .findIndex() 做了类似的事情——不确定哪个表现更好。
猜你喜欢
  • 2018-10-09
  • 2021-06-17
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多