如何基于name字段合并数组并去重,且保持selected元素前置
合并两个对象数组并去重(selected元素前置)
我有两个对象数组:
const selected = []; const current = [ { id: 1, name: "abc" }, { id: 2, name: "def" } ]; const result = []
需要生成无重复元素的result数组,规则为:
selected中的元素必须置于result开头- 基于
name字段判断元素是否重复
示例说明
示例1:selected为空
输入:
const selected = []; const current = [ { id: 1, name: "abc" }, { id: 2, name: "def" } ];
预期结果:
result = [ { id: 1, name: "abc" }, { id: 2, name: "def" } ];
示例2:selected含current没有的元素
输入:
const selected = [ {id:5, name: "xyz" }]; const current = [ { id: 1, name: "abc" }, { id: 2, name: "def" } ];
预期结果:
result = [ { id: 5, name: "xyz" }, { id: 1, name: "abc" }, { id: 2, name: "def" } ];
示例3:selected与current存在重复元素
输入:
const selected = [ {id:1, name: "abc" }, {id:4, name: "lmn" }]; const current = [ { id: 1, name: "abc" }, { id: 2, name: "def" } ];
预期结果:
result = [ { id: 1, name: "abc" }, { id: 4, name: "lmn" }, { id: 2, name: "def" } ];
我尝试的代码(未达预期)
const res = [...(selected || [])].filter((s) => current.find((c) => s.name === c.name) );
解决方案
要实现需求,我们需要保留selected全部元素,再从current中过滤掉与selected重复的元素(按name判断),最后将两部分拼接。使用Set存储已存在的name可提升判断重复的效率:
// 收集selected中所有name,快速判断重复 const selectedNames = new Set(selected.map(item => item.name)); // 先把selected的所有元素放入结果 const result = [...selected]; // 过滤current中未在selected出现过的元素,追加到结果 result.push(...current.filter(item => !selectedNames.has(item.name)));
验证结果
- 示例1:
selected为空,current所有元素都被追加,结果符合预期 - 示例2:
selected中的xyz保留,current的abc、def因未重复被追加,结果正确 - 示例3:
selected中的abc、lmn保留,current中仅def未重复被追加,结果正确
内容的提问来源于stack exchange,提问作者user16860065
相关产品推荐
相关产品推荐

