如何使用 ES 标准按数组数据对对象值求和?[关闭]

How can I sum object values by array data using ES standard? [closed]

提问人:DonkeySticks 提问时间:3/12/2022 最后编辑:DonkeySticks 更新时间:3/12/2022 访问量:133

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

我有一个对象数组。每个对象都有一个带有数组列表的“tag”属性。此列表中的值从一个对象重复到另一个对象。我想根据“标签”数组总结“成本”和“收入”。不确定解释是否有意义,但我有下面的数据结构。

我希望数据是什么样子的:

const expected = 
  [ { cost:  500, revenue:  800, tag: 'new'       } 
  , { cost:  800, revenue: 1400, tag: 'equipment' } 
  , { cost: 1300, revenue: 1650, tag: 'wholesale' } 
  , { cost:  300, revenue:  600, tag: 'old'       } 
  ] 

数据的样子:

const data = 
  [ { cost: 500, revenue: 800, tag: [ 'new', 'equipment', 'wholesale' ]} 
  , { cost: 300, revenue: 600, tag: [ 'old', 'equipment'              ]} 
  , { cost: 800, revenue: 850, tag: [ 'wholesale'                     ]} 
  ] 
JavaScript的 ECMAScript-2017

评论

0赞 DonkeySticks 3/12/2022
我尝试将reduce与map一起使用,但它没有正确出现。
2赞 Andy 3/12/2022
请将您尝试的代码添加到您的问题中,作为最小的可重现示例。我们无法调试我们看不见的代码。
0赞 DonkeySticks 3/12/2022
@Andreas因为“new”标签只出现一次,所以没有什么可求和的。

答:

1赞 cmgchess 3/12/2022 #1

A 和 to 分组 by 标签,然后获取每个标签的值reduceforEach

var a= [
  {
    "cost": 500,
    "revenue": 800,
    "tag": [
      "new",
      "equipment",
      "wholesale"
    ]
  },
  {
    "cost": 300,
    "revenue": 600,
    "tag": [
      "old",
      "equipment"
    ]
  },
  {
    "cost": 800,
    "revenue": 850,
    "tag": [
      "wholesale"
    ]
  }
]
let x = Object.values(a.reduce((acc,{cost,revenue,tag})=>{
    tag.forEach((t) => {
    if(!acc[t])acc[t]={tag:t,cost:0,revenue:0}
    acc[t].revenue+=revenue
    acc[t].cost+=cost
  })
  return acc;
},{}))
console.log(x)