如何按指定条件分组对象数组并重构quantity相关属性?
数组合并与字段转换实现方案
原始数组
array = [ { "id":1, "type":"abc", "quantity":36, "code":"EDF", "period":"2023-04-01" }, { "id":0, "type":"yrf", "quantity":40, "code":"SFDF", "period":"2023-04-02" }, { "id":0, "type":"yrf", "quantity":22, "code":"SFDF", "period":"2023-04-02" }, { "id":1, "type":"abc", "quantity":19, "code":"EDF", "period":"2023-04-01" } ]
需求说明
- 当数组元素的
period、type、code三者相同时,合并这些元素 - 若元素
id为1:将quantity值存入新属性quantity_{{code}}_cy,quantity_{{code}}设为空字符串 - 若元素
id为0:将quantity值存入新属性quantity_{{code}},quantity_{{code}}_cy设为空字符串 - 合并后的目标数组示例:
finalArray=[ { "id":1, "type":"abc", "quantity_EDF_cy":36, "code":"EDF", "quantity_EDF":"", "period":"2023-04-01" }, { "id":0, "type":"yrf", "quantity_SFDF_cy":"", "quantity_SFDF":22, "code":"SFDF", "period":"2023-04-02" } ]
实现代码(JavaScript)
通过分组聚合+字段映射实现,核心是用临时对象按条件分组,再统一处理字段:
function processTargetArray(arr) { const groupContainer = {}; arr.forEach(item => { // 生成唯一分组标识,确保同条件元素归为一组 const groupKey = `${item.period}-${item.type}-${item.code}`; const cyField = `quantity_${item.code}_cy`; const normalField = `quantity_${item.code}`; if (!groupContainer[groupKey]) { // 初始化分组基础属性 groupContainer[groupKey] = { id: item.id, type: item.type, code: item.code, period: item.period }; // 根据id初始化对应字段值 groupContainer[groupKey][cyField] = item.id === 1 ? item.quantity : ''; groupContainer[groupKey][normalField] = item.id === 0 ? item.quantity : ''; } else { // 合并同组元素(示例取最后一个元素的quantity,需求和则改为累加) if (item.id === 1) { groupContainer[groupKey][cyField] = item.quantity; } else { groupContainer[groupKey][normalField] = item.quantity; } } }); // 将分组对象转为数组,得到最终结果 return Object.values(groupContainer); } // 调用示例 const finalArray = processTargetArray(array); console.log(finalArray);
代码说明
- 分组逻辑:用
period-type-code拼接成唯一键,保证相同条件的元素被分到同一组 - 字段初始化:首次创建分组时,根据元素
id直接赋值对应字段,另一字段设为空 - 合并处理:同组后续元素直接覆盖对应字段值,若需求为求和,可将赋值改为累加逻辑
- 结果转换:将分组容器的value集合转为数组,输出最终格式
内容的提问来源于stack exchange,提问作者Anita
相关产品推荐
相关产品推荐

