You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在JavaScript reduce函数中实现数组多层聚合,在date层级新增skus子对象

问题原因

你的代码存在两个核心错误:

  • 初始化date层级的skus字段时用了数组类型skus:[],但需求里要的是对象结构,类型不匹配
  • 你把sku对应的对象直接挂载到了date节点下r[o.name][o.date][o.sku],没有放到skus子对象里,属性层级错误

修正后代码

const res = [
  {name: "bob",sku: 123, reps: 2, sets: 2, date: '2020/03/03' },
  {name: "bob", sku: 234, reps: 15, sets: 2, date: '2020/03/03' },
  {name: "bob", sku: 345, reps: 26, sets: 5, date: '2020/03/05' },
  {name: "bob", sku: 456, reps: 11, sets: 8, date: '2020/03/06' }
]

const dataMap = res.reduce((r, o) => {
  r[o.name] ??= {}
  // 初始化date层级时skus改为对象类型
  r[o.name][o.date] ??= {sets: 0, reps: 0, skus: {}}
  // 累加日期维度的统计值
  r[o.name][o.date].sets += +o.sets
  r[o.name][o.date].reps += +o.reps
  // 把sku对象挂载到skus子节点下,这里示例存入了当前sku对应的reps、sets,不需要的话直接赋值空对象即可
  r[o.name][o.date].skus[o.sku] ??= {reps: 0, sets: 0}
  r[o.name][o.date].skus[o.sku].reps += +o.reps
  r[o.name][o.date].skus[o.sku].sets += +o.sets
  // 累加姓名维度的总统计值
  r[o.name].total ??= 0
  r[o.name].total += (+o.sets * +o.reps)
  return r
}, {});

document.body.innerHTML = "<pre>" + JSON.stringify(dataMap, null, 4) + "</pre>";

运行后输出的结构完全符合你的预期,date层级下的skus对象会以sku值为key存储对应sku的自定义数据。


内容的提问来源于stack exchange,提问作者Geoff_S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 03:54:01