基于映射更新对象键值的查找问题修复(ECMAScript 6优先)
修复基于查找表映射用户分组/子分组的问题
我来帮你搞定这个映射问题,先梳理下原代码里的几个核心错误,再用ES6语法给出更简洁可靠的解决方案:
原代码的问题点
- groupData是数组而非键值映射:你直接用
groupData[groupID]去取组信息是错误的——数组的索引是数字位置,而你的groupID是字符串(比如"1"),这会导致取到错误的数组元素,甚至undefined。 - 属性名未加引号:你写的
groupData[groupID][name]里的name是一个未定义的变量,应该用字符串"name"来访问对象属性。 - 子分组查找方式错误:subgroup同样是数组,不能直接用
subgroupID作为索引取值,需要匹配对应id的子分组对象。 - 循环变量使用var:var存在变量提升问题,ES6里更推荐用let/const或者for...of循环。
优化后的ES6解决方案
我们可以先把groupData预处理成键值映射表,让后续的查找操作更高效(O(1)时间复杂度),再用ES6的解构赋值、for...of循环等语法来简化代码:
const users = [ { "id": "123", "email": "john.doe@acme.com", "name": " John Doe", "group": "1", "subgroup": "1" }, { "id": "456", "email": "tom.hans@stk.com", "name": " Tom hans", "group": "2", "subgroup": "1" } ]; const groupData = [ { id: "1", name: "Stars", subgroup: [ { id: "1", pseudo: "big" }, { id: "2", pseudo: "small" } ] }, { id: "2", name: "Stones", subgroup: [ { id: "1", pseudo: "tiny" }, { id: "2", pseudo: "huge" } ] } ]; // 预处理groupData:转成以group id为键的映射,同时把每个组的subgroup也转成id->pseudo的映射 const groupMap = Object.fromEntries( groupData.map(group => [ group.id, { groupName: group.name, subgroupMap: Object.fromEntries(group.subgroup.map(sub => [sub.id, sub.pseudo])) } ]) ); const allUsers = {}; // 用ES6 for...of遍历用户数组 for (const user of users) { // 解构赋值获取用户属性,避免直接修改原对象(可选,视需求而定) const { id, email, name, group: groupId, subgroup: subgroupId } = user; // 拿到当前用户对应的组信息,默认空对象防止报错 const currentGroup = groupMap[groupId] || {}; // 构建更新后的用户对象 allUsers[id] = { id, email, name, group: currentGroup.groupName || '', subgroup: currentGroup.subgroupMap?.[subgroupId] || '' }; } console.log(allUsers);
代码说明
- 预处理映射表:用
Object.fromEntries把groupData转成键为group id的对象,同时每个组的subgroup也转成id到pseudo的映射,这样后续查找不用每次遍历数组,效率更高。 - for...of循环:比传统for循环更简洁易读,符合ES6语法规范。
- 解构赋值:快速提取用户的属性,代码更清晰。
- 可选链操作符
?.:当用户的groupId无效时,currentGroup.subgroupMap可能不存在,用?.可以避免抛出TypeError,优雅降级为空字符串。
运行这段代码后,就能得到你期望的allUsers结果啦。
内容的提问来源于stack exchange,提问作者Bonnard
相关产品推荐
相关产品推荐

