JS按id分组聚合month数据有没有更简洁的实现方式?
有更简洁的单行实现方案,用Array.reduce()就能实现,相比原方案两次遍历数组的写法,新方案只需要遍历一次,性能也更优。
实现代码
// 支持 ES2021+ 环境 const accumulator = data.reduce((acc, { id, month }) => ((acc[id] ??= []).push(month), acc), {});
说明
- 以空对象
{}作为reduce的初始累加值 - 每次遍历解构出当前项的
id和month属性,通过空值合并赋值运算符??=判断:如果累加对象中不存在对应id的属性,就先给它赋值为空数组 - 将
month推入对应数组后,返回累加对象进入下一轮遍历 - 如果你需要兼容更低版本的JS运行环境,可以把
??=替换为逻辑或赋值运算符||=,写法如下:
// 低版本兼容写法 const accumulator = data.reduce((acc, { id, month }) => ((acc[id] = acc[id] || []).push(month), acc), {});
运行后输出的结果和你原代码的输出完全一致。
内容的提问来源于stack exchange,提问作者knot22
相关产品推荐
相关产品推荐

