1、普通的for循环,或用include (效率比较低)
var arr1=[1,5,2,3,4,1,5,3,4] var arr2 = []; for (var i = 0; i < arr1.length; i++) { if (arr2.indexOf(arr1[ i ])==-1) { arr2.push(arr1[ i ]) } }
或用includes
function distinct(arr) { let result = [] for (let item of arr) { !result.includes(item) && result.push(item) } return result }
2、Array.filter() + indexOf 通过判断下标(效率比较低)
function distinct(arr) {return arr.filter((item, index)=> { return arr.indexOf(item) === index }) }
3、双重 for 循环 (效率也比较低)
function distinct(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); // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一 len--; j--; } } } return arr }
4、Array.sort() 效率稍高些
function distinct(arr) { arr = arr.sort() let result = [arr[0]] for (let i=1, len=arr.length; i<len; i++) { arr[i] !== arr[i-1] && result.push(arr[i]) } return result }
5、ES6中的 new Set() 效率比较高
function distinct(arr) { return Array.from(new Set(arr)) }
var arr=[1, 2, 3, 3, 3, '0', '1', '2',1]; arr=[...new Set(arr)];
6、for...of + Object 利用对象的属性不会重复这一特性,校验数组元素是否重复 效率最高
function distinct(arr) { let result = [] let obj = {} for (let item of arr) { if (!obj[item]) { result.push(item) obj[item] = 1 } } return result }