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

JavaScript中如何获取去重后的对象数组?

对象数组去重的实现方法

针对你提供的包含重复对象的数组,这里有几种实用的去重方案,能得到你想要的唯一对象数组:

方法1:利用JSON.stringify + Set快速去重

适合对象属性顺序固定、没有不可序列化值的场景,代码简单直接:

const data = [ { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "29", project: "Javascript" }, { "name": "abc", age: "31", project: "C++" }, { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "31", project: "Java" }];

// 去重逻辑
const uniqueData = [...new Set(data.map(item => JSON.stringify(item)))].map(str => JSON.parse(str));

console.log(uniqueData);

输出结果就是你期望的去重数组:

[ { "name": "abc", age: "31", project: "Java" },{ "name": "abc", age: "29", project: "Javascript" }, { "name": "abc", age: "31", project: "C++" }]

⚠️ 注意:如果对象的属性顺序不同(比如一个是{name:"abc", age:"31"},另一个是{age:"31", name:"abc"}),这种方法会把它们当成不同对象;另外对象里有函数、Symbol这类无法序列化的值时,这个方法会失效。

方法2:自定义唯一键 + reduce + Map(推荐)

这种方法可以灵活控制去重规则,不受属性顺序影响,兼容性和适用性更强:

const data = [ { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "29", project: "Javascript" }, { "name": "abc", age: "31", project: "C++" }, { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "31", project: "Java" }];

// 生成唯一键的函数:按属性名排序后拼接,确保属性顺序不影响判断
const generateUniqueKey = (obj) => {
  return Object.keys(obj).sort().map(key => `${key}:${obj[key]}`).join('|');
};

// 去重逻辑
const uniqueData = [...data.reduce((map, item) => {
  const key = generateUniqueKey(item);
  if (!map.has(key)) {
    map.set(key, item);
  }
  return map;
}, new Map()).values()];

console.log(uniqueData);

这个方法的好处是,不管对象属性顺序怎么变,只要属性名和对应值都相同,就会被视为重复对象;而且能处理更多类型的属性值。

方法3:filter + findIndex(小数据量适用)

如果你的数组数据量不大,这种直观的方法也能用:

const data = [ { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "29", project: "Javascript" }, { "name": "abc", age: "31", project: "C++" }, { "name": "abc", age: "31", project: "Java" }, { "name": "abc", age: "31", project: "Java" }];

const uniqueData = data.filter((item, index) => {
  // 只保留第一次出现的对象
  return data.findIndex(i => i.name === item.name && i.age === item.age && i.project === item.project) === index;
});

console.log(uniqueData);

缺点是每遍历一个元素都要重新查找整个数组,数据量大时性能会比较差。

内容的提问来源于stack exchange,提问作者rahul5140

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:15:33