数组去重的5种方法

170 阅读2分钟

方法一、Set去重

这个方法是我日常开发中最喜欢用的方法,因为他的使用在所有去重方法中最简单的。

new Set是ES6新推出的一种类型,他的数组的区别在于,Set类型中的数据不可以有重复的值

缺点:

  • 去重后的数组是一个伪数组,可以用扩展运算符或from方法,将伪数组转换为真数组
  • 在Set里面存储数据,采用的是强引用,如果不将其主动清除引用,会造成内存泄漏。可以用WeakSet存储对象,因为WeakSet是弱引用,不影响js的回收。
  • 但是Set去重有一个弊端,他无法去重引用类型的数据,比如对象数组;数组中都是值类型的时候,使用Set去重,能方便很多
//执行里面的代码
const arr = [1,1,2,2,3,3,4,4,5,5];
const setData = Array.from(new Set(arr));
console.log(setData);

运行结果 image.png

方法二、indexOf去重

数组的indexOf()方法可返回某个指定的元素在数组中首次出现的位置。 该方法首先定义一个空数组res,然后调用indexOf方法对原来的数组进行遍历判断,如果返回-1,表示元素不在res中,则将其push进res中,最后将res返回即可获得去重的数组。

function unique(arr) {
    // 判断是否是数组
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    let res = []
    for (let i = 0; i < arr.length; i++) {
        if (res.indexOf(arr[i]) === -1) {
            res.push(arr[i])
        }
    }
    return res
}

方法三、indexOf和filter去重

利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素

const unique = (arr) => arr.filter((item,index) => arr.indexOf(item) === index);

方法四、includes去重

循环数组的每一样,用新数组检测当前数组中是否包含数组项,如果不包含,则追加该元素

const unique = (arr) => {
    let repeatArr = [];
    for (let i = 0,len = arr.length ; i < len; i++)
        if (!repeatArr.includes(arr[i])) repeatArr.push(arr[i])
    return repeatArr;
}

方法五、双重for循环去重(经典)

循环比较数组中的数组

//双重循环去重
const unique = (arr) => {
    for (let i=0,len = arr.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1);
                j--;
                len--;
            }
        }
    }
    return arr;
};

image.png