看了那么多博客,数组去重无非就 2 类:两层循环法 和 对象自身键不可重复。
let arr1 = Array.from(new Array(100000), (item, index) => {
     return index;
});
let arr2 = Array.from(new Array(50000), (item, index) => {
     return index + index;
});
let arr = arr1.concat(arr2);
以上面的arr为例,分别进行测试:
一、两层循环法
- 两层 for循环
for (let i = 0; i < arr.length; i++) {
     for (let j = arr.length - 1; j > i; j--) {//倒数
           if (arr[i] === arr[j]) {
               arr.splice(j, 1);//splice 会改变数组的长度
          }
     }
}

- for + indexOf
let result = []
for (var i = 0; i < arr.length; i++) {
     if (result .indexOf(arr[i]) === -1) {
         result .push(arr[i])
     }
}

- for + includes
let result = []
for (var i = 0; i < arr.length; i++) {
     if (!result .includes(arr[i]) ) {
         result .push(arr[i])
     }
}

for 的变体如filter、for...of、forEach、map等和for没差太多,此处不一一例举。
- reduce
arr = arr.reduce((prev, cur) => (prev.includes(cur) ? prev : [...prev, cur]),[]);

二、对象自身键不可重复
- for + Object
let result = []
let obj = {}
for (var i = 0; i < arr.length; i++) {
      const arrValue = arr[i];
      if (!obj[arrValue]) {
          result.push(arrValue);
          obj[i] = 1;
      }
}

- 
Set:2 种写法,性能差不多
arr= [...new Set(arr)] 
//或
arr= Array.from(new Set(arr)); 

总结
- 性能最优的是for + Object,其次是set方法,推荐这两种。其他单层for循环性能都差不多
- 
reduce性能最差,慎用。双重for循环性能也较差,最好不用










