目录
一、基于indexOf/includes实现方案(具有兼容性,最好自己写一个实现indexof)
1、利用数组方法splice
let ary = [12,23,12,15,25,23,14,16];
for(let i=0;i<ary.length-1;i++){
let item = ary[i],
args = ary.slice(i+1);
if(args.indexOf(item)>-1){
//包含,我们可以把当前项干掉
//splice删除弊端
//1、原来数组改变,这样如果i继续++,则会产生数组塌陷
//2、性能不好,当前一项删除,后面索引都要变
ary.splice(i,1);
i--;
}
}
console.log(ary)
2、利用filter过滤
let ary = [12,23,12,15,25,23,14,16];
for(let i=0;i<ary.length-1;i++){
let item = ary[i],
args = ary.slice(i+1);//从第二项开始选取复制
if(args.indexOf(item)>-1){
//也可以用过滤的方法,让重复的值都为null,最后过滤删掉(后续filter一次)
ary[i] = null;
}
}
ary = ary.filter(item=>item!=null)//过滤掉为null的值
console.log(ary)
3、用最后一项替换,新建空数组
let ary = [12,23,12,15,25,23,14,16],
arr = []
for(let i=0;i<ary.length-1;i++){
let item = ary[i],
args = ary.slice(i+1);//从第二项开始选取复制
if(args.indexOf(item)>-1){
//用最后一项替换
ary[i] = ary[ary.length-1];//
ary.length--;
i--;
}else{
//新建空数组,不相等的push进去
arr.push(item);//i的length要和ary的length相等
}
}
console.log(ary)
二、双循环(思路:获取没重复的最右一值放入新数组,检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)
function unique(ary){
let r = [];
for(let i=0;i<ary.length;i++){
for(let j=i+1;j<ary.length;j++)
if(ary[i] === ary[j]) j=++i;
r.push(ary[i]);
}
return r;
}
let arr1 = [12,23,12,15,25,14,16];
arr1 = unique(arr1);
三、先排序,在相邻比较(基于正则)
let ary = [12,23,12,15,25,14,16];
ary.sort((a,b) => a-b);
let str = ary.join('@')+'@';//字符串以@分隔
let reg = /(\d+@)\1*/g;
ary = [];
str.replace(reg,(n,m)=>{
m = Number(m.slice(0,m.length-1));
ary.push(m);
})
console.log(ary)
四、对象键值对(也就是把数组里面的项弄成对象,属性名属性值一样)
let ary = [12,23,12,15,25,14,16];
let obj = {};//拿数组中的每一项向新容器中存储,如果已经存储过,把当前项干掉
for(let i=0;i<ary.length;i++){
let item = ary[i];
//检测当前对象的属性
if(typeof obj[item]!=='undefined'){
ary[i] = ary[ary.length-1];
ary.length--;
i--;
continue
}
obj[item] = item;
}
obj = null;
console.log(ary)
五、Set(es6方法)
let ary = [12,23,12,15,25,23,25,14,16];
//let arr = new Set(ary);//这样返回结果只是是set这个类的实例
//我们要的是返回数组,所以要利用展开运算符下面这种方式或者Array.from(new Set(arr))(把类数组转为数组)
let arr = [...new Set(ary)]
console.log(arr)
在这几大类里面有N种实现方式,但是总体思路都是这几大类,大家可以回去试一下,