使用Array Reduce分组数组元素时LINES数组重复项处理问询
合并嵌套数组中的重复LINE条目
看起来你已经用reduce实现了按PO编号分组的嵌套数组,但遇到了同PO下重复LINE条目的问题——这是因为当前代码没有做重复校验,直接把所有条目都push进LINES数组了。咱们可以调整一下reduce的逻辑,先检查是否已有相同的LINE条目,再决定是合并字段还是新增条目:
let result = Object.values(response.data.reduce((r, { PO_NO, PO_LINE_NO, MATERIAL_NO, MATERIAL_NAME, PO_QTY, GRPO_QTY, GRPO_SHIPDATE }) => { // 确保当前PO的容器对象存在 r[PO_NO] = r[PO_NO] || { PO_NO, LINES: [] }; // 查找当前PO下是否已有相同LINE_NO的条目 const existingLine = r[PO_NO].LINES.find(line => line.LINE_NO === PO_LINE_NO); if (existingLine) { // 如果存在重复条目,按需合并字段 // 这里以累加GRPO_QTY为例,你可以根据业务需求调整逻辑 existingLine.GRPO_QTY += GRPO_QTY; // 比如如果需要更新为最新的发货日期,就加上这行: // existingLine.GRPO_SHIPDATE = GRPO_SHIPDATE; } else { // 如果没有重复,添加新的LINE条目 r[PO_NO].LINES.push({ LINE_NO: PO_LINE_NO, PO_QTY: PO_QTY, MATERIAL_NO: MATERIAL_NO, MATERIAL_NAME: MATERIAL_NAME, GRPO_QTY: GRPO_QTY, GRPO_SHIPDATE: GRPO_SHIPDATE }); } return r; }, {}));
关键逻辑说明:
- 用
Array.find()检查当前PO的LINES数组中,是否已经存在和当前条目LINE_NO相同的记录 - 如果找到重复条目,就根据业务需求合并字段:比如累加入库数量
GRPO_QTY,或者更新为最新的发货日期等 - 如果没有找到重复,再执行
push操作添加新条目
自定义重复判断规则:
如果你的重复判断依据不只是LINE_NO(比如需要结合MATERIAL_NO一起判断),只需要修改find的条件即可:
// 同时匹配LINE_NO和MATERIAL_NO const existingLine = r[PO_NO].LINES.find(line => line.LINE_NO === PO_LINE_NO && line.MATERIAL_NO === MATERIAL_NO );
内容的提问来源于stack exchange,提问作者Kay Singian
相关产品推荐
相关产品推荐

