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,第一次出现才添加。

相关推荐
程序员小寒2 小时前
前端高频面试题之Vue(高级篇)
前端·javascript·vue.js
用户9714171814272 小时前
Vue3实现拖拽排序
javascript·vue.js
CC码码2 小时前
重生之我在浏览器里“蹦迪”
前端·javascript·three.js
阡陌昏晨2 小时前
H5性能优化-打开效率提升了62%
前端·javascript·vue.js
小小前端_我自坚强2 小时前
React 18 新特性深度解析
前端·javascript·react.js
zwq写js2 小时前
VSCode定制开发——内置中文翻译插件
javascript·visual studio code
道一233 小时前
在Electron应用中控制剪贴板操-复制&粘贴
前端·javascript·electron
xulihang3 小时前
如何在Windows上使用SANE扫描文档
linux·前端·javascript
半桶水专家4 小时前
Vue Pinia 插件详解
前端·javascript·vue.js