JavaScript如何实现对象数组按name字段去重生成唯一元素数组
按name字段去重生成目标数组
你需要的是按对象的name属性做去重判断,丢弃name重复的项,最终输出仅包含name属性的唯一值数组,可参考以下实现:
方法1:基础遍历实现(性能最优,时间复杂度O(n))
用Set结构记录已经出现过的name值,遍历原数组时判断当前name是否已存在,不存在就推入结果数组:
let arr = [{id:1, name:'tert'},{id:2, name:'tety'},{id:3, name:'gfvc'},{id:8, name:'tert'}] const nameSet = new Set() const arrrslt = [] for (const item of arr) { if (!nameSet.has(item.name)) { nameSet.add(item.name) arrrslt.push({ name: item.name }) } }
运行后arrrslt的输出和你预期完全一致:[{ name:'tert'},{name:'tety'}, {name:'gfvc'}]
方法2:链式调用简洁写法
如果偏好函数式写法,可以用filter+map组合实现,逻辑和上面完全一致:
const nameSet = new Set() const arrrslt = arr .filter(item => !nameSet.has(item.name) && nameSet.add(item.name)) .map(item => ({ name: item.name }))
注意事项
- 该实现默认保留第一次出现的name对应的项,后续同name的项会被直接过滤
- 不建议用全对象序列化(比如
JSON.stringify)的方式做去重,这种方式会受对象属性顺序、属性值类型影响,容易出现判断错误,明确按指定字段去重是最稳定的方案
内容的提问来源于stack exchange,提问作者Lex V
相关产品推荐
相关产品推荐

