JavaScript如何提取合并嵌套对象数组属性生成指定结构?
现有实现问题
你当前的代码可以跑通,但逻辑依赖persons数组的索引顺序匹配,一旦出现某条数据的persons数组长度、元素顺序不一致的情况,会出现姓名匹配错误的潜在问题。
更优实现方案
方案1:通用鲁棒版本(支持多id分组)
用Map做id索引分组,不受元素顺序、长度影响,适配所有场景:
const result = data.reduce((acc, { persons, type }) => { acc.types.push(type); persons.forEach(({ id, name }) => { acc.peopleMap.has(id) ? acc.peopleMap.get(id).names.push(name) : acc.peopleMap.set(id, { id, names: [name] }); }); return acc; }, { peopleMap: new Map(), types: [] }); result.people = Array.from(result.peopleMap.values()); delete result.peopleMap;
方案2:极简版本(适配你给出的固定场景)
如果你的业务场景确定所有persons数组永远只有1个元素、且id固定为1,可以直接两次map遍历,代码最简洁、性能最高:
const result = { people: [{ id: 1, names: data.map(i => i.persons[0].name) }], types: data.map(i => i.type) };
实现优势
- 去掉了索引遍历的潜在风险,逻辑语义更明确
- 极简版本相比reduce实现少了分支判断,执行效率更高
- 通用版本支持多id自动分组,后续业务扩展不需要重写逻辑
内容的提问来源于stack exchange,提问作者gcksean
相关产品推荐
相关产品推荐

