如何使用对象值对对象数组进行分组,然后对分组对象的列值求和。这是示例对象。
let salesData = [
{
'phone': 'iPhone',
'city': 'NewYork',
'01/09': 200,
'02/09': '',
'03/09': 120,
'04/09': ''
},
{
'phone': 'iPhone',
'city': 'Los Angels',
'01/09': 80,
'02/09': 140,
'03/09': '',
'04/09': 15
},
{
'phone': 'Samsung',
'city': 'New York',
'01/09': '',
'02/09': 70,
'03/09': 10
'04/09': 20
}
],
dynamicKeys = ['01/09', '02/09', '03/09'];
在这里,我需要将数据与城市分组并对 dynamicKeys 的值求和,如下所示
[
{
'city': 'New York',
'01/09': 200,
'02/09': 70,
'03/09': 130
},
{
'city': 'Los Angels',
'01/09': 80,
'02/09': 140,
'03/09': ''
}
]
这是我试过的代码,但它不起作用
let newArr = salesData.reduce((acc, item) => {
let existItem = acc.find(d =>
item.city === d.city
)
if(existItem){
dynamicKeys.forEach(d => {
if(!isNaN(item[d])) existItem[d] += item[d]
})
}else{
acc.push(item);
}
return acc
},[])
这里的分组似乎有效,但 dynamicKeys 的总和不正确,使用 loadsh/plain js 实现这一目标的最佳方法是什么
我们可以使用Array.reduce()创建所需的结构,我们创建一个具有每个城市名称属性的对象,然后是动态键中每个销售日期的属性。
一旦我们构建了这个对象,我们就可以使用Object.values()以数组的形式获取数据:
const salesData = [ { 'phone': 'iPhone', 'city': 'New York', '01/09': 200, '02/09': '', '03/09': 120, '04/09': '' }, { 'phone': 'iPhone', 'city': 'Los Angeles', '01/09': 80, '02/09': 140, '03/09': '', '04/09': 15 }, { 'phone': 'Samsung', 'city': 'New York', '01/09': '', '02/09': 70, '03/09': 10, '04/09': 20 } ];
const dynamicKeys = ['01/09', '02/09', '03/09'];
const result = Object.values(salesData.reduce((acc, salesItem) => {
return dynamicKeys.reduce((acc, key) => {
acc[salesItem.city] = acc[salesItem.city] || { city: salesItem.city };
acc[salesItem.city][key] = (+acc[salesItem.city][key] || 0) + (+salesItem[key] || 0);
return acc;
}, acc);
}, {}))
console.log('Sales data:', result)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句