JavaScript 对象数组去重的几种方法

部分内容由大模型生成

根据对象的某个属性(如 id)对对象数组去重的几种方法。

Map

js 复制代码
const arr = [
  { id: 'a', name: 'Object A' },
  { id: 'b', name: 'Object B' },
  { id: 'c', name: 'Object C' },
  { id: 'a', name: 'Object A (重复)' },
  { id: 'd', name: 'Object D' },
  { id: 'b', name: 'Object B (重复)' }
];

const unique = [...new Map(arr.map(item => [item.id, item])).values()]

console.log(unique)
// 输出: 
// [
//   {id: 'a', name: 'Object A (重复)'}
//   {id: 'b', name: 'Object B (重复)'}
//   {id: 'c', name: 'Object C'}
//   {id: 'd', name: 'Object D'}
// ]

Map 的键(key)唯一,map(item => [item.id, item]) 把每个对象用 id 当键,后面的重复项会覆盖。最后用 .values() 得到去重后的对象数组。

此方法会保留最后一个 出现的 id 对应的对象。

filter & findIndex

js 复制代码
const unique = arr.filter((item, index, self) =>
  index === self.findIndex(t => t.id === item.id)
)
// 输出: 
// [
//   {id: 'a', name: 'Object A'}
//   {id: 'b', name: 'Object B'}
//   {id: 'c', name: 'Object C'}
//   {id: 'd', name: 'Object D'}
// ]

findIndex 找到数组中首个 id 相同的元素位置,只有第一个匹配项会被保留。

reduce & some

js 复制代码
const unique = arr.reduce((acc, cur) => {
  if (!acc.some(item => item.id === cur.id)) {
    acc.push(cur)
  }
  return acc
}, [])
// 输出: 
// [
//   {id: 'a', name: 'Object A'}
//   {id: 'b', name: 'Object B'}
//   {id: 'c', name: 'Object C'}
//   {id: 'd', name: 'Object D'}
// ]

累积构建一个新数组,遇到重复的 id 不再添加。

filter & Set

js 复制代码
const seen = new Set()
const unique = arr.filter(item => !seen.has(item.id) && seen.add(item.id))
// 输出: 
// [
//   {id: 'a', name: 'Object A'}
//   {id: 'b', name: 'Object B'}
//   {id: 'c', name: 'Object C'}
//   {id: 'd', name: 'Object D'}
// ]

利用 Set 记录已出现的 id,第一次出现才添加。

相关推荐
你怎么知道我是队长1 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
名字还没想好☜2 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
心中有国也有家3 小时前
AtomGit Flutter 鸿蒙客户端:ModalBottomSheet 实战
android·javascript·学习·flutter·华为·harmonyos
仙人球部落5 小时前
-python-LangGraph框架(3-31-LangGraph 「合并式状态管理」的原理与实践)
开发语言·javascript·python
sunfdf6 小时前
Next.js 新手从零部署到首跑实战指南
开发语言·javascript·ecmascript
SmartBoyW6 小时前
前端死磕:一文彻底搞懂 JS 事件循环 (Event Loop) 与宏微任务
前端·javascript
mONESY7 小时前
基于MCP协议搭建全链路智能Agent:地图检索+浏览器自动化+本地文件操控实战
javascript
研☆香7 小时前
闭包实战避坑指南
javascript
你怎么知道我是队长8 小时前
JavaScript 的控制语句介绍
开发语言·javascript·ecmascript