数组去重有各种各样的方法,简单粗暴的我们可以这样写[...new Set(arr)];
而下面的方法考虑到了其他的一些数据,例如连自己都不认识自己的NaN。
let obj ={};
let newArr = ['1',1,1,'a','a','b','b','','',obj,obj,null,null,undefined,undefined,{},{},NaN,NaN,'undefined','NaN'];
//利用es6 set 除了{}之外都能去重
Array.prototype.unique = function(){
return Array.from(new Set(this));
};
//利用indexOf {}和NaN去不了重但是能区分NaN和字符串'NaN'
Array.prototype.unique1 = function (){
let newArray = [];
this.forEach( ele =>{
// statements
if(newArray.indexOf(ele) === -1){
newArray.push(ele);
};
});
return newArray;
};
//利用for嵌套
//除了{}之外都能去重
Array.prototype.unique2 = function (){
let newArray;
for (let i = 0; i < this.length; i++) {
for (let j = i+1; j < this.length; j++) {
//利用es6对象新的扩展方法实现NaN去重
if ( Object.is(this[i] ,this[j])) {
this.splice(j,1);
j--;
};
};
};
return newArray = this;
};
//利用对象属性不重复的特点
不能识别1 '1' obj {} 一视同仁
Array.prototype.unique3 = function (){
var obj = {};
var newArray = [];
this.forEach( function(ele) {
// statements
if(!obj[ele]){
obj[ele] = ' ';
newArray.push(ele);
};
});
return newArray;
};
//利用es6 map数据结构解决1,'1'问题 区分不了{}
Array.prototype.unique4 = function (){
let obj1 = new Map();
let newArray =[];
this.forEach( ele=> {
// statements
if(!obj1.has(ele)){
obj1.set(ele,' ')
newArray.push(ele)
};
});
return newArray;
};
//利用sort
// 区分不了{}
Array.prototype.unique5 = function (){
let arr = this.sort();
let newArray = [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) {
newArray.push(arr[i]);
};
};
return newArray;
};
//利用includes
// 区分不了{}
Array.prototype.unique6 = function (){
let newArray = [];
this.forEach(ele => {
if(!newArray.includes(ele)){
newArray.push(ele);
};
});
return newArray;
};
//利用filter
// 区分不了{},NaN 与字符串'NaN' 但是能区分NaN与NaN
Array.prototype.unique7 = function (){
return this.filter((item, index, arr)=>{
return Object.is(arr.indexOf(item, 0) , index);
});
};
//利用reduce
//除了{}
Array.prototype.unique8 = function (){
let arr = this.sort();
let newArray = [];
let len = arr.length -1;
arr.reduce((i1,i2)=>{
if(i1 !== i2){
newArray.push(i1);
};
return i2;
});
newArray.push(arr[len]);
return newArray;
};
//利用hasOwnProperty
//区分不了{} 与定义的obj
Array.prototype.unique9 = function (){
let obj = new Map();
return this.filter( item => {
return obj.hasOwnProperty(typeof item + item ) ? false : (obj[typeof item + item] = true);
});
};
// 很明显{} === {} 是不可能为true的 还有种方法就是用JSON.stringify 来实现{}的去重 但是这样也不是严格意义上的去重