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 = true
break; //当前元素已重复,跳出当前循环
}
}
//判断当前元素是否重复
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))
}