如何基于匹配对象属性合并两个数组?(Lodash/原生JS)
当然可以搞定这个需求!不管是用原生JavaScript还是Lodash,都有简洁高效的实现方式,我给你两种方案参考:
原生JavaScript实现
如果不想引入第三方库,原生JS就能完美解决。为了提升性能(尤其是数据量大的时候),我们可以先把users数组转换成一个以user_id为键的映射对象,这样查找用户信息的时间复杂度是O(1),避免嵌套循环带来的性能损耗:
const users = [{ user_id: 100, name: 'Bob' }, { user_id: 101, name: 'Joe' }]; const departments = [{ id: 900, manager: 100 }, { id: 901, manager: 101 }]; // 构建用户ID到用户名的映射 const userMap = users.reduce((acc, user) => { acc[user.user_id] = user.name; return acc; }, {}); // 遍历部门数组,添加对应的用户名 const updatedDepartments = departments.map(dept => ({ // 展开原部门对象的所有属性 ...dept, // 根据manager字段从映射中获取用户名 name: userMap[dept.manager] })); console.log(updatedDepartments); // 输出:[{ id: 900, manager: 100, name: 'Bob' }, { id: 901, manager: 101, name: 'Joe' }]
Lodash实现
如果你已经在项目中使用了Lodash,可以利用它提供的工具函数让代码更简洁。这里推荐用_.keyBy先构建用户映射,再用_.map遍历部门数组:
const _ = require('lodash'); // 确保已引入Lodash const users = [{ user_id: 100, name: 'Bob' }, { user_id: 101, name: 'Joe' }]; const departments = [{ id: 900, manager: 100 }, { id: 901, manager: 101 }]; // 按user_id分组构建用户对象 const userMap = _.keyBy(users, 'user_id'); // 生成更新后的部门数组 const updatedDepartments = _.map(departments, dept => ({ ...dept, // 用_.get避免找不到用户时出现undefined(可选,根据需求调整) name: _.get(userMap, `${dept.manager}.name`) })); console.log(updatedDepartments); // 输出和原生方案一致
两种方案都能得到你想要的结果,原生方案更轻量,Lodash方案则在处理复杂数据时更灵活~
内容的提问来源于stack exchange,提问作者Clay Banks
相关产品推荐
相关产品推荐

