数组去重

4,193 阅读1分钟

1、ES6中set去重(最推荐)

new Set是ES6新推出的一种类型。他和数组的区别在于,Set类型中的数据不可以有重复的值。当然,数组的一些方法Set也无法调用。

使用方法,将一个数组转化为Set数据,再转化回来,就完成了去重

 const arr = [1,1,2,2,3,3,4,4,5,5];
 const setData = Array.from(new Set(arr));
 console.log(setData);

弊端:他无法去重引用类型的数据,比如对象数组

如果数组中都是值类型的数据(比如全string或者全number),则使用set是首选

 

2、双重for循环

const handleRemoveRepeat = (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;
};

 

3、indexOf去重

const handleRemoveRepeat = (arr) => {
    let repeatArr = [];
    for (let i = 0,len = arr.length ; i < len; i++) 
     if (repeatArr.indexOf(arr[i]) === -1)  repeatArr.push(arr[i])
    return repeatArr;
}

 

4、includes去重

includes的判断方法更简单。循环数组的每一项,用新数组检测当前数组中是否包含数组项,如果不包含,则追加该元素。

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

 

5、使用filter配合indexOf进行的去重

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

 

 

关于对象数组去重

对象数组去重,需要有一个去重条件,也就是根据哪个字段进行去重

以双重循环数组举例

const handleRemoveRepeat = (arr) => {
   for (let i=0,len = arr.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
            if (arr[i].id === arr[j].id) {
                arr.splice(j, 1);
                j--;
                len--;
            }
        }
    }
     return arr;
}