javascript - 按公共键(日期字符串)对对象数组进行分组
问题描述
我有一个数组如下。
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 不是代码编写网站。但我是根据一些数据得出的。但这是我完成目标的最后阶段。而且我不知道我怎么能这样分组。如果您能帮我解决这个问题,我将不胜感激。非常感谢您阅读它。
解决方案
对我来说,最佳方法是用 构建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%;}
推荐阅读
- image - 如何在本机反应中为我的所有图像修复相同的尺寸?
- r - R:检测重复行,并找出每个重复组的计数
- mysql - 如何使用镜头概念 6(-) 将数据导入数据库
- jmeter - JMeter 上的客户端同步
- javascript - 如何获取 Javascript 中的最后 N 个实体以进行 Azure 存储表查询
- javascript - 用于设备控制 (REST) 的自定义事情板小部件
- javascript - Hammerjs 和 React:检测夹点事件的结束
- php - Bootstrap Carousel jQuery 1 of 5 滑块编号在单击之前不会更新
- swift - ProgressHUD:架构 x86_64 的未定义符号:
- python - 检查是否设置了标志以及存储默认值