JavaScript按operationGroup.groupId为同组对象添加groupedOperations属性
实现方法
整个处理流程不需要额外依赖,仅通过两次遍历即可完成,完全匹配你提出的判定规则:
- 第一次遍历原始数组,建立
groupId到同组所有对象的映射表,自动跳过operationGroup为null的对象 - 第二次遍历原始数组,按规则为每个对象判断是否需要新增属性:
- 若对象
operationGroup为null,不对其做任何修改 - 若该对象对应的groupId在映射表中仅关联1个对象(即全数组仅出现1次),不对其做任何修改
- 仅当同组对象数量≥2时,才为当前对象新增
groupedOperations属性,属性值为对应组的全部对象数组
- 若对象
完整可运行代码
const originalList = [ { operation: 11111, operationGroup: null }, { operation: 22222, operationGroup: { groupId: 20 } }, { operation: 33333, operationGroup: { groupId: 1 } }, { operation: 44444, operationGroup: { groupId: 20 } } ]; // 构建groupId与同组对象的映射 const groupStore = {}; originalList.forEach(item => { if (!item.operationGroup) return; const gid = item.operationGroup.groupId; groupStore[gid] = groupStore[gid] || []; groupStore[gid].push(item); }); // 按规则生成最终结果 const finalResult = originalList.map(item => { if (!item.operationGroup) return item; const gid = item.operationGroup.groupId; const sameGroupItems = groupStore[gid]; // 单元素分组不新增groupedOperations属性 if (sameGroupItems.length === 1) return item; return { ...item, groupedOperations: sameGroupItems }; });
结果说明
代码输出完全符合规则要求:
operation:11111的对象因operationGroup为null,保持原结构无新增属性operation:33333的对象对应groupId=1,全数组仅出现1次,保持原结构无新增属性- 两个对应groupId=20的对象,均会携带
groupedOperations数组,数组内存储同组的全部两个对象
注:你提供的预期输出示例中存在对象括号闭合不匹配的语法错误,上述代码会输出语法完全合法的结构
内容的提问来源于stack exchange,提问作者Gabriel Souza
相关产品推荐
相关产品推荐

