如何在JavaScript对象数组中获取id与name的唯一组合?
如何按id与name的唯一组合对对象数组去重?
给定如下对象数组:
let data = [ { id: 1, name: 'a' }, { id: 1, name: 'b'}, { id: 1, name: 'a'}, { id: 2, name: 'a'}, { id: 2, name: 'b'}, { id: 3, name: 'c'}, { id: 3, name: 'c'} ];
需要得到id与name组合唯一的结果数组:
[ { id: 1, name: 'a'}, { id: 1, name: 'b'}, { id: 2, name: 'a'}, { id: 2, name: 'b'}, { id: 3, name: 'c'} ]
由于Set默认通过对象引用判断唯一性,直接存储对象无法实现组合去重,以下是几种可行的解决方案:
方法1:使用Set+字符串键过滤
通过将id和name拼接成唯一字符串作为标识,用Set记录已出现的组合,过滤数组只保留首次出现的组合:
const seen = new Set(); const uniqueData = data.filter(item => { // 生成唯一组合键 const key = `${item.id}-${item.name}`; if (!seen.has(key)) { seen.add(key); return true; } return false; }); console.log(uniqueData); // 输出目标结果
方法2:使用Reduce+Map存储
用reduce遍历数组,结合Map存储已处理的组合键,构建去重后的数组:
const map = new Map(); const uniqueData = data.reduce((acc, item) => { const key = `${item.id}-${item.name}`; if (!map.has(key)) { map.set(key, item); acc.push(item); } return acc; }, []);
方法3:使用JSON.stringify生成唯一标识
如果对象属性顺序固定,也可以用JSON.stringify将对象转为字符串作为判断依据,但这种方法对属性顺序敏感,不推荐用于属性可能变动的场景:
const seen = new Set(); const uniqueData = data.filter(item => { const str = JSON.stringify(item); if (!seen.has(str)) { seen.add(str); return true; } return false; });
核心逻辑说明
所有方法的本质都是将多键组合转换为可被Set/Map识别的唯一值,因为原生Set无法直接判断对象内容是否相等,只能通过引用或统一的字符串标识来区分重复项。
内容的提问来源于stack exchange,提问作者lorem_ipsum
相关产品推荐
相关产品推荐

