You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:20:38