【问题标题】:Group and sum array of obects using Lodash使用 Lodash 对对象数组进行分组和求和
【发布时间】:2021-09-08 15:39:02
【问题描述】:

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

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'];

这里我需要用城市对数据进行分组,并对动态键的值求和,像这样

[
   {
     '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 实现此目的的最佳方法是什么

【问题讨论】:

    标签: javascript arrays object data-structures


    【解决方案1】:

    我们可以使用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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 2021-06-26
      • 2021-05-04
      • 1970-01-01
      • 2021-10-23
      • 2023-04-10
      • 2018-01-09
      • 2015-06-04
      相关资源
      最近更新 更多