js中对象数组根据对象id去重

js中对象数组根据对象id去重

可以使用 Array.filter() 方法结合 Array.findIndex() 方法来去重,具体实现如下:

const arr = [
  { id: 1, name: 'apple' },
  { id: 2, name: 'banana' },
  { id: 1, name: 'orange' },
  { id: 3, name: 'pear' }
];

const uniqueArr = arr.filter((item, index, self) => {
  // 利用findIndex方法找到第一个与当前元素id相等的元素索引
  const i = self.findIndex(t => t.id === item.id);
  // 如果当前索引等于当前元素在self中的最初出现位置索引,则表示元素符合要求,不是重复元素,保留
  return i === index;
});

const arr = [
{ id: 1, name: ‘apple’ },
{ id: 2, name: ‘banana’ },
{ id: 1, name: ‘orange’ },
{ id: 3, name: ‘pear’ }
];

const uniqueArr = arr.filter((item, index, self) => {
// 利用findIndex方法找到第一个与当前元素id相等的元素索引
const i = self.findIndex(t => t.id === item.id);
// 如果当前索引等于当前元素在self中的最初出现位置索引,则表示元素符合要求,不是重复元素,保留
return i === index;
});

console.log(uniqueArr); // [{ id: 1, name: ‘apple’ }, { id: 2, name: ‘banana’ }, { id: 3, name: ‘pear’ }]

上述代码利用了 Array.filter() 方法的特性,把自身中重复的元素去掉,最后得到没有重复元素的新数组。

### 对象数组中的复项 为了对象数组中基于 `id` 属性的复项,可以采用多种方法实现这一目标。下面介绍一种利用 JavaScript 的高阶函数和数据结构来完成此操作的方式。 #### 方法一:使用 Set 和 map 函数 这种方法通过创建一个新的映射关系(Map),其中键为对象的 `id` 字段值,而值则为整个对象本身。由于 Map 结构不允许存在相同的键名,因此能够自动过滤掉具有相同 ID 的多余条目[^1]。 ```javascript const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 1, name: 'Alice' } ]; // 使用 Map 来存储唯一的 user 对象 function getUniqueUsersById(usersArray) { const uniqueUsers = Array.from(new Map( usersArray.map(user => [user.id, user]) ).values()); return uniqueUsers; } console.log(getUniqueUsersById(users)); ``` 另一种常见的做法是借助 lodash 库提供的工具函数 `_.uniqBy()`,它可以更简洁地处理这个问题: #### 方法二:使用 Lodash 的 uniqBy 函数 Lodash 是一个非常流行的实用程序库,在这里可以直接调用其内置的方法来进行操作。只需指定要依据的对象字段即可轻松解决问题。 ```javascript import _ from 'lodash'; const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 1, name: 'Alice' } ]; const uniqueUsers = _.uniqBy(users, 'id'); console.log(uniqueUsers); ``` 这两种方式都能有效地解决给定问题,并且可以根据项目需求和个人偏好选择合适的技术方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值