数据去重的方法大全

172 阅读1分钟

1.两个for循环

缺点:对象和 NaN 不去重

注意: splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一

 var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
      for (let i = 0, len = num.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
          if (num[i] == num[j]) {
            num.splice(j, 1);
            len--;
            j--;
          }
     }
}    

//方法笨拙,如果数组长度很大,效率会很低

2.filter + indexOf

思路:利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等

注意: 对象不去重 ,NaN 会被忽略掉

indexOf 底层使用的是 === 进行判断,使用 indexOf 查找不到 NaN 元素

arr.indexOf(NaN); // -1

  var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
      num = num.filter((item, index) => {
        return num.indexOf(item) == index;
      }); 

3.for循环+indexof

 let newArr = [1,2,4,5,6,6]
 for (var i = 0, len = arr.length; i < len; i++) {
    if (newArr.indexOf(arr[i]) == -1) {
     newArr.push(arr[i])
  }
 }

4.sort()排序 + for循环

思路:利用sort,再判断相邻位置是否有相同的

注意:Set可以去重NaN类型,不去重对象

var num = [1, 2, 6, 4, 5, 6, 3, 6, 5];
num = num.sort();
var s=[];
for(let i=0,len=num.length;i<len;i++){
   if(num[i]!=num[i+1]){
     s.push(num[i])
 }
}
 let arr = [1, 3, 6, 6, 8, 8, 9, 4, 5, 4, 9];
 let newArr = arr.sort();
 let s= newArr.filter((item, index) => {
   return newArr[index] != newArr[index + 1]
 })

 

5.Es6的... + new set()

注意:对象不去重 NaN 去重

思想: ES6 提供的数据结构 Set,它一个特性就是成员值都是唯一的,没有重复的值。

 var num = [1, 2, 6, 4, 5,8, 6, 3, 6, 5,7,8,9];
 num = [...new Set(num)];

耗时:

双重 for 循环 > Array.filter()加 indexOf > Array.sort() 加一行遍历冒泡 > ES6中的Set去重 > Object 键值对去重复