基于ES6从两个对象数组按id去重后返回新数组的方案求助
解决方案:从数组中剔除ID重复的元素
嘿,我懂你遇到的问题了——你想从newUsers数组里移除那些在likedUsers中拥有相同id的用户,而且只关心id字段对吧?你之前用嵌套forEach的写法之所以不对,是因为只要当前newUsers里的用户和某一个likedUsers的用户id不匹配,就会把这个用户推到结果数组里,导致同一个用户被多次添加,完全达不到去重的效果。
下面给你两种用ES6方法实现的正确方案:
方法一:用filter + Set(推荐,效率更高)
这种方法先把需要排除的id提取到一个Set中(Set的查找效率是O(1),比遍历数组快很多),再用filter过滤出符合条件的用户:
const newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ]; const likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ]; // 提取likedUsers中所有用户的id,存入Set const excludedIds = new Set(likedUsers.map(user => user.id)); // 过滤newUsers,只保留id不在excludedIds中的用户 const leftUsers = newUsers.filter(user => !excludedIds.has(user.id)); console.log(leftUsers); // 输出结果:[{name: 'lauren', id: 35}, {name: 'dave', id: 28} ]
方法二:用forEach实现(如果你更习惯forEach的写法)
如果你一定要用forEach,可以先把排除的id存好,再遍历判断:
const newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ]; const likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ]; const excludedIds = new Set(likedUsers.map(user => user.id)); const leftUsers = []; newUsers.forEach(user => { // 只有当用户id不在排除列表里时,才添加到结果数组 if (!excludedIds.has(user.id)) { leftUsers.push(user); } }); console.log(leftUsers); // 同样得到目标结果
这两种方法都能准确得到你想要的leftUsers,而且比你之前的嵌套forEach写法更高效、更清晰。
内容的提问来源于stack exchange,提问作者The Walrus
相关产品推荐
相关产品推荐

