看了那么多博客,数组去重无非就 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
循环性能也较差,最好不用JS实现数组去重方法整理