1、创建一个新数组来储存判断元素,双重循环,最原始的逻辑 es3
let arr1 = [1,1,2,23,3,4,4,3];function uniqueArr (arr){if(arr.length){let _arr = [],isRepeat;for(var i = 0; i < arr.length; i++){isRepeat = false;for(var j = 0; j < _arr.length; j++){if(_arr[j] === arr[i] ){isRepeat = truebreak; //当前元素已重复,跳出当前循环}}//判断当前元素是否重复if(!isRepeat){_arr.push(arr[i])}}}return _arr}
2、利用对象属性不可重名的特点 filter去重 es5
let arr1 = [1,1,2,2,3,3,2,1];function uniqueArr(arr){let obj = {},newArr = arr.filter((item)=>{if(obj[item]){return false}else{obj[item] = Symbol()return true}});return newArr}
3、利用sort先排序,重复元素会排到一起,判断前一项和后一项是否相等。 es5
let arr1 = [1,2,1,2,3,3,5,5,6,89];function uniqueArr (arr){arr.sort()let newArr = [];for( var i =0; i < arr.length; i++ ){if(arr[i] !== arr[i+1]){newArr.push(arr[i])}// 判断条件改成 arr[i] !== newArr[newArrl.length - 1] 也行}return newArr}
4、利用Array.prototype.indexOf 返回第一次出现的索引 reduce去重(返回一个累计计算的数组)
let arr1 = [1,1,2,2,3,3,1,2,8];function uniArr(arr){let newArr = arr.reduce((accumulotar,ele,index)=>{if(arr.indexOf(ele) === index){accumulotar.push(ele)}return accumulotar},[]);return newArr}
5、es6 - includes
includes与indexOf的区别:
includes返回boolean,对NaN有效。
indexOf返回 -1 和 索引,对NaN无效(返回-1)。
let arr1 = [1,2,2,1,6,5,6,5];function uniqueArr (arr){let newArr = [];arr.forEach((item)=>{if(newArr.includes(item)){break;}else{newArr.push(item)}})return newArr}
6、利用set(储存值唯一性)去重
let arr1 = [1,1,2,2,1,5,6,7,6,7,5];function uniqueArr(arr){return Array.from(new Set(arr))}
