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

按picker_id分组求和嵌套对象数组字段的问题修正

分组求和问题修正

需求概述

对包含嵌套products数组的对象数组,按picker_id分组,分别求和以下字段:

  • current_capacity(对应结果中的total_volume)
  • process_time_in_minutes(对应结果中的total_time)
  • 嵌套products数组中所有picked_qty的总和(对应结果中的total_products)

原始数据

var arr = [
  {
    current_capacity: 6000,
    picker_id: "icQrHPuE2fMZslceSG6liwuRar92",
    process_time_in_minutes: 10,
    products: [
      {
        product_id: 1,
        picked_qty: 2
      },
      {
        product_id: 2,
        picked_qty: 3
      }
    ]
  },
  {
    current_capacity: 2500,
    picker_id: "icQrHPuE2fMZslceSG6liwuRar92",
    process_time_in_minutes: 20,
    products: [
      {
        product_id: 1,
        picked_qty: 10
      }
    ]
  },
  {
    current_capacity: 36000,
    picker_id: "WIRzfIZALeftRk3DRGvh4nBdxQV2",
    process_time_in_minutes: 15,
    products: [
      {
        product_id: 1,
        picked_qty: 2
      },
      {
        product_id: 2,
        picked_qty: 3
      }
    ]
  }
];

原实现代码

var res = arr.reduce((acc, obj) => {
  var existObj = acc.find((item) => item.picker_id === obj.picker_id);
  if (existObj) {
    let total_picked = obj.products.reduce((acc2, curr) => acc2 + curr);

    existObj.current_capacity = existObj.current_capacity + obj.current_capacity;
    existObj.process_time_in_minutes = existObj.process_time_in_minutes + obj.process_time_in_minutes;

    existObj.total = existObj.total ? existObj.total : 0 + total_picked;
    return acc;
  }
  acc.push(obj);
  return acc;
}, []);

const formatted = res.map((el) => {
  return {
    picker_id: el.picker_id,
    total_volume: el.current_capacity,
    total_time: el.process_time_in_minutes,
    total_products: el.total
  };
});

当前错误结果

[
 {
   picker_id: "icQrHPuE2fMZslceSG6liwuRar92",
   total_volume: 8500,
   total_time: 30,
   total_products: "0[object Object]"
 },
 {
   picker_id: "WIRzfIZALeftRk3DRGvh4nBdxQV2",
   total_volume: 36000,
   total_time: 15,
   total_products: undefined
  }
]

期望正确结果

[
 {
   picker_id: "icQrHPuE2fMZslceSG6liwuRar92",
   total_volume: 8500,
   total_time: 30,
   total_products: 15
 },
 {
   picker_id: "WIRzfIZALeftRk3DRGvh4nBdxQV2",
   total_volume: 36000,
   total_time: 15,
   total_products: 5
  }
]

修正方案及代码

原代码存在三个核心错误:

  1. 计算total_picked时,直接累加对象curr而非对象的picked_qty属性,导致字符串拼接错误
  2. 初始化existObj.total时运算符优先级错误,0 + total_picked未被正确执行
  3. 新对象加入数组时未初始化total字段,导致最终结果出现undefined

修正后的完整代码:

var res = arr.reduce((acc, obj) => {
  // 计算当前对象的products总和
  const currentPickedTotal = obj.products.reduce((sum, product) => sum + product.picked_qty, 0);
  
  var existObj = acc.find((item) => item.picker_id === obj.picker_id);
  if (existObj) {
    // 累加容量和时间
    existObj.current_capacity += obj.current_capacity;
    existObj.process_time_in_minutes += obj.process_time_in_minutes;
    // 累加products总和,确保初始值为0
    existObj.total += currentPickedTotal;
    return acc;
  }
  // 新对象加入时,复制原对象并初始化total字段
  acc.push({
    ...obj,
    total: currentPickedTotal
  });
  return acc;
}, []);

const formatted = res.map((el) => {
  return {
    picker_id: el.picker_id,
    total_volume: el.current_capacity,
    total_time: el.process_time_in_minutes,
    total_products: el.total
  };
});

关键修正点说明

  • 新增currentPickedTotal变量,正确计算当前对象products中picked_qty的总和
  • 累加total时使用+=,并确保新对象加入时已初始化total为当前对象的picked_qty总和
  • 使用扩展运算符...obj复制原对象,避免修改原始数据引用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:25:18