技术需求:数组仅允许id为5的对象重复,其余id对象需去重
处理JavaScript数组:仅保留id为5的重复项,移除其他id的重复对象
需求很明确:在对象数组里,只有id === 5的对象可以重复出现,其他id的对象只保留首次出现的实例,后续重复的都要删掉。
输入示例
const arrData = [ {id:1,name:"John"}, {id:2,name:"david"}, {id:5,name:"rohn"}, {id:4,name:"Alex"}, {id:1,name:"roy"}, {id:5,name:"malan"}, {id:3,name:"jonny"}, {id:2,name:"rod"} ];
预期输出
[ {id:1,name:"John"}, {id:2,name:"david"}, {id:5,name:"rohn"}, {id:4,name:"Alex"}, {id:5,name:"malan"}, {id:3,name:"jonny"} ]
解决方案
可以用Array.reduce()结合Set来高效处理,逻辑清晰且性能不错:
const processedArr = arrData.reduce((acc, current) => { // 用Set记录已经保留过的非5的id const seen = acc.seen; if (current.id === 5) { // id为5的直接加入结果数组 acc.result.push(current); } else if (!seen.has(current.id)) { // 非5的id没出现过,就加入结果并记录到Set里 seen.add(current.id); acc.result.push(current); } return acc; }, { result: [], seen: new Set() }).result; console.log(processedArr);
代码解释
- 初始化一个累加器对象,包含
result(存储最终数组)和seen(用Set存储已处理的非5id,确保O(1)的查找效率)。 - 遍历原数组的每个对象:
- 若当前对象
id是5,直接添加到result,不做额外判断。 - 若
id不是5,检查seen里是否存在该id:不存在则添加到result并把id存入seen;存在则跳过。
- 若当前对象
- 最后取出累加器里的
result就是处理后的数组。
内容的提问来源于stack exchange,提问作者vjtechno
相关产品推荐
相关产品推荐

