如何转换映射:将值转为键并合并关联值为数组存入对应键
数据整合与格式转换方案
需求说明
整合三组数据,将names数组中的name字段作为对象键,把关联的phoneNumbers中的phoNumb字段整理为数组存入对应键,最终得到指定格式的结果。
原始数据
const names= [ { id: 1, name: 'JULIO FONTOVA' }, { id: 2, name: 'CHRISTIAN JONES' }, { id: 3, name: 'MARK DAVIES' } ]; const nexus = [ { namesId: 1, phoNumbId: 1, country: 'PERU', mount: 1200 }, { namesId: 1, phoNumbId: 2, country: 'CANADA', mount: 2000}, { namesId: 2, phoNumbId: 2, country: 'ENGLAND', mount: 3000}, { namesId: 2, phoNumbId: 3, country: 'RUSSIA', mount: 40000}, { namesId: 3, phoNumbId: 1, country: 'BELGIUM', mount: 500}, { namesId: 3, phoNumbId: 2, country: 'SPAIN', mount: 500}, { namesId: 3, phoNumbId: 3, country: 'PORTUGAL', mount: 2020} ] const phoneNumbers= [ { id: 1, phoNumb: '111', name: 'JHON EVANS'}, { id: 2, phoNumb: '222', name: 'JUDITH SOTO'}, { id: 3, phoNumb: '333', name: 'OSCAR CIENFUEGOS'}, { id: 4, phoNumb: '444', name: 'ANDREW JONES'} ]
目标结果
const mergedNumbers = [ {'JULIO FONTOVA': ['111', '222']}, {'CHRISTIAN JONES': ['222', '333']}, {'MARK DAVIES': ['111', '222', '333']} ]
实现代码
// 建立nameId与name的映射表 const nameMap = new Map(names.map(item => [item.id, item.name])); // 建立phoneId与phoNumb的映射表 const phoneMap = new Map(phoneNumbers.map(item => [item.id, item.phoNumb])); // 按姓名分组收集电话号码 const groupedData = {}; nexus.forEach(entry => { const userName = nameMap.get(entry.namesId); const userPhone = phoneMap.get(entry.phoNumbId); if (!groupedData[userName]) { groupedData[userName] = []; } // 避免重复添加同一号码 if (!groupedData[userName].includes(userPhone)) { groupedData[userName].push(userPhone); } }); // 转换为目标数组格式 const mergedNumbers = Object.entries(groupedData).map(([name, phones]) => ({ [name]: phones })); console.log(mergedNumbers);
代码说明
- 用
Map构建id与对应值的映射,减少数组遍历次数,提升处理效率 - 遍历关联表
nexus,通过映射表快速匹配姓名和电话号码,完成分组收集 - 最后将分组后的对象转换为目标数组结构,每个元素为单独的键值对对象
内容的提问来源于stack exchange,提问作者MarcoPavez
相关产品推荐
相关产品推荐

