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

JavaScript数组对象往期日期库存累加求和逻辑错误修正求助

解决日期库存累加的逻辑问题及原对象修改问题

你的代码主要存在两个核心问题,我来逐一拆解并给出修复方案:

问题分析

  1. 意外修改原对象:你直接操作了o.stock,而o是原数组中对象的引用,这会导致原始的obj数组里的库存数据被悄悄修改,这在大多数场景下都是需要避免的。
  2. 累加逻辑不符合预期:
    • 第一个日期的库存没有设置为0(对应“往期无库存”的场景)
    • 你的逻辑是把当前元素的库存和前一个处理后的库存相加,这和你期望的“往期所有日期库存累加总和”逻辑不匹配。

修复方案

下面提供两种简洁且符合需求的实现方式,都不会修改原对象,且输出完全符合你的期望:

方案一:使用reduce维护累计值

const obj = [
  { date: '2021-05-30', stock: 230, location_id: 'Bangalore' },
  { date: '2021-05-31', stock: 350, location_id: 'Bangalore' },
  { date: '2021-06-01', stock: 320, location_id: 'Bangalore' },
  { date: '2021-06-07', stock: 210, location_id: 'Bangalore' },
  { date: '2021-06-08', stock: 210, location_id: 'Bangalore' },
  { date: '2021-06-09', stock: 210, location_id: 'Bangalore' },
  { date: '2021-06-10', stock: 210, location_id: 'Bangalore' }
];

const result = obj.reduce((acc, current, index) => {
  const { resultArr, total } = acc;
  // 第一个元素往期无库存,设为0;后续元素取之前所有原库存的总和
  const newStock = index === 0 ? 0 : total;
  // 创建新对象,避免修改原数据
  const newObj = { ...current, stock: newStock };
  // 更新累计值:加上当前原对象的库存
  return {
    resultArr: [...resultArr, newObj],
    total: total + current.stock
  };
}, { resultArr: [], total: 0 }).resultArr;

console.log(result);

方案二:使用map配合外部累计变量(更直观)

const obj = [
  { date: '2021-05-30', stock: 230, location_id: 'Bangalore' },
  { date: '2021-05-31', stock: 350, location_id: 'Bangalore' },
  { date: '2021-06-01', stock: 320, location_id: 'Bangalore' },
  { date: '2021-06-07', stock: 210, location_id: 'Bangalore' },
  { date: '2021-06-08', stock: 210, location_id: 'Bangalore' },
  { date: '2021-06-09', stock: 210, location_id: 'Bangalore' },
  { date: '2021-06-10', stock: 210, location_id: 'Bangalore' }
];

let totalStock = 0;
const result = obj.map((item, index) => {
  const newStock = index === 0 ? 0 : totalStock;
  // 先生成新对象,再更新累计值
  const newObj = { ...item, stock: newStock };
  totalStock += item.stock;
  return newObj;
});

console.log(result);

方案说明

  • 不修改原对象:通过扩展运算符{...item}创建全新的对象,原始数组obj的所有数据都会保持原样。
  • 逻辑匹配期望:第一个日期的库存设为0,后续每个日期的库存都是之前所有原始库存的累加总和,运行后会完全输出你想要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:08:11