使用 Lodash 对对象进行分组和求和数组

兰吉斯

如何使用对象值对对象数组进行分组,然后对分组对象的列值求和。这是示例对象。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章