JS实现对象数组去重的6种方法

前言

在开发中,javascript数组去重是一个比较常见的需求,解决方法也有很多种,最佳的方法取决于数据类型和去重需求。

js实现数组去重的11种方法
js实现对象数组去重的6种方法

1、使用 .filter() 和 .findIndex() 相结合的方法

使用 filter() 方法过滤掉重复的元素,使用 findIndex() 方法判断对象是否重复

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = arr.filter((item, index) => arr.findIndex(i => i.id === item.id) === index);

console.log(uniqueArr)
// [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]

2、使用 .reduce() 方法

使用 reduce() 方法维护一个累加器,通过对象的属性来判断是否重复

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = arr.reduce((acc, curr) => {
  if (!acc.find(item => item.id === curr.id)) {
    acc.push(curr);
  }
  return acc;
}, []);

console.log(uniqueArr)
// [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]

3、使用 .forEach() 和 .some() 相结合的方法

使用 forEach() 方法遍历数组,使用 some() 方法判断是否重复

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = [];
arr.forEach(item => {
  if (!uniqueArr.some(i => i.id === item.id)) {
    uniqueArr.push(item);
  }
});

console.log(uniqueArr)
// [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]

4、使用 Map

使用 Map 结构去重对象数组时,需要借助 array.map() 函数将对象数组进行转换

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = [...new Map(arr.map(item => [item.id, item])).values()];

console.log(uniqueArr)
// [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]

5、使用 Object.create()

使用Object.create(),按照对象的属性来判断是否重复

const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}];
const uniqueArr = arr.filter(function (item) {
    return !this[item.id] && (this[item.id] = true);
}, Object.create(null));

console.log(uniqueArr)
// [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]

6、使用 For const of 和 find 结合

这个方法的思想与方法3类似

  • 创建一个空的唯一数组来存储唯一对象。
  • 循环遍历数组中的对象。对于每个对象,如果它不是重复的,则将其添加到唯一数组。否则,忽略它
  • const arr = [{id: 1, name: "a"}, {id: 2, name: "b"},
        {id: 1, name: "c"}, {id: 3, name: "d"}];
    const unique = [];
    for (const item of arr) {
        const isDuplicate = unique.find((obj) => obj.id === item.id);
        if (!isDuplicate) {
            unique.push(item);
        }
    }
    
    console.log(uniqueArr)
    // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
    

    针对多个属性进行去重

    有时候,您可能希望仅当对象具有两个或多个具有相同值的属性时才将其视为重复对象——多个属性值相同。对于这种情况,我们可以将上述方法进行稍微调整就可以进行使用。

    使用 .filter() 和 .findIndex() 相结合的方法

    const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "a"}, {id: 3, name: "d"}];
    const uniqueArr = arr.filter((item, index) => arr.findIndex(i => i.id === item.id && i.name === item.name) === index);
    
    console.log(uniqueArr)
    // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
    

    使用 For const of 和 find 结合的方法

    const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "a"}, {id: 3, name: "d"}];
    const uniqueArr = [];
    for (const item of arr) {
        const isDuplicate = uniqueArr.find((obj) =>
            obj.id === item.id && obj.name ==item.name);
        if (!isDuplicate) {
            uniqueArr.push(item);
        }
    }
    
    console.log(uniqueArr)
    // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
    

    赞(0) 打赏

    评论 抢沙发

    觉得文章有用就打赏一下文章作者

    非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

    支付宝扫一扫

    微信扫一扫