首页 > 解决方案 > 按公共键(日期字符串)对对象数组进行分组

问题描述

我有一个数组如下。

            const list = [
               {
                 date: "2020-01-01",
                 number: 3,
                 count: 2
               },
               {
                 date: "2020-01-01",
                 number: 3,
                 count: 2
               },
               {
                 date: "2020-01-01",
                 number: 3,
                 count: 2
               },
               {
                 date: "2020-01-02",
                 number: 4,
                 count: 1
               },
               {
                 date: "2020-01-02",
                 number: 4,
                 count: 1
               }
             ]

我想总结数字和计数取决于同一日期。之后,它应该在同一日期合并。因此我想得到如下结果。

   const list = [{
     totalNumber: 9,
     totalCount: 6,
     detail:[{
             date: "2020-01-01",
             number: 3,
             count: 2
           },
           {
             date: "2020-01-01",
             number: 3,
             count: 2
           },
           {
             date: "2020-01-01",
             number: 3,
             count: 2
           }]
          },
      {
          totalNumber: 8,
          totalCount: 2,
          detail:[  
          {
             date: "2020-01-02",
             number: 4,
             count: 1
           },
           {
             date: "2020-01-02",
             number: 4,
             count: 1
           }]
         }
         ]

我知道 stackoverflow 不是代码编写网站。但我是根据一些数据得出的。但这是我完成目标的最后阶段。而且我不知道我怎么能这样分组。如果您能帮我解决这个问题,我将不胜感激。非常感谢您阅读它。

标签: javascript

解决方案


对我来说,最佳方法是用 构建Map(将必要的属性作为键)Array.prototype.reduce(),然后用 提取值数组(聚合记录)Map.prototype.values()

const src = [{date:"2020-01-01",number:3,count:2},{date:"2020-01-01",number:3,count:2},{date:"2020-01-01",number:3,count:2},{date:"2020-01-02",number:4,count:1},{date:"2020-01-02",number:4,count:1}],
             
      groupped = [...src
        .reduce((acc, {date, number, count}) => {
          const group = acc.get(date)
          if(group){
            group.totalNumber += number
            group.totalCount += count
            group.detail.push({date, number, count})
          } else {
            acc.set(
              date,
              {
                date,
                totalNumber: number,
                totalCount: count,
                detail: [{
                  date,
                  number,
                  count
                }]
              }
            )
          }
          return acc
        }, new Map)
        .values()
      ]
        
console.log(groupped)
.as-console-wrapper{min-height:100%;}


推荐阅读