提及来数组去重,可能基本上每一个人都能写出来3中左右的方法,可是每个简单的方法,或者说每一种简单的方式,均可能是一个知识点,多看,多写,多用。数组
第一种:循环套循环去重
const sy1=Symbol();
const sy2=Symbol();
const arr1=[1,2,"a",3,'2',2,1,3,'a',undefined,null,NaN,null,undefined,NaN,sy1,sy2]
Array.prototype.qcArray=function(){
const _this=this;
const newArr=[];
for(let i=0;i<_this.length;i++){
for(let t=i+1;t<_this.length;t++){
if(this[i]===this[t]){
i++;
t=i;
}
}
newArr.push(this[i])
}
return newArr
}
原理是利用双层循环,当第二层循环的时候好比i=0时,t=6的时候发现相等了,就跳过这个外层循环。
第二种:遍历数组,若是新数组中没有旧的数组,则添加进去
Array.prototype.qsArr1=function(){
const _this=this;
const na=[];
for(let i=0;i<_this.length;i++){
if(na.indexOf(_this[i])<0){
na.push(_this[i])
}
}
return na
}
第三种:使用ES6的新属性new Set(); 相似数组,成员的值惟一
function qsArr2(arr) {
return [...(new Set(arr))]
}
第四种:对象的属性惟一
Array.prototype.qsArr2=function(){
const _this=this,obj={},na=[];
for(let v of _this){
if(!obj[v]){
na.push(v);
obj[v]=1
}
}
return na
}
从效率上讲,最后一种是最高的,Set()排行第二,循环遍历是最慢的
第五种:先排序在作处理,利用Array.sort();
Array.prototype.qsArr3=function () {
const nArr=this.sort();
const na = [];
for (let i = 0; i < nArr.length; i++) {
if(nArr[i]!==nArr[i+1])
na.push(nArr[i])
}
return na
}
复制代码
每一种方法都有本身的思想,理解了,就会在实际项目当中用到。 我获得了一个我认为重要的想法,解决问题是多样的,多思考。bash