JavaScript数组对象往期日期库存累加求和逻辑错误修正求助
解决日期库存累加的逻辑问题及原对象修改问题
你的代码主要存在两个核心问题,我来逐一拆解并给出修复方案:
问题分析
- 意外修改原对象:你直接操作了
o.stock,而o是原数组中对象的引用,这会导致原始的obj数组里的库存数据被悄悄修改,这在大多数场景下都是需要避免的。 - 累加逻辑不符合预期:
- 第一个日期的库存没有设置为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
相关产品推荐
相关产品推荐

