一、方法一
【简单思路实现】
依次拿出数组的中的每一项,和后面的所有项进行比较,如果有相同的就删除。
示例代码
var ary=[1,2,3,2,4];
/*
思路:
第一次:
拿出数组的第一项:1
给[2,3,2,4]进行比较,如果有重复就删除
拿出数组的第二项:2
====[3,2,4]进行比较,有重复的删除 [3,4]
拿出数组的第三项:3
===4 进行比较,有重复的删除,没有重复
还用拿最后一项4吗?====不用了
依次拿出数组中的每一项给剩余的所有项进行比较
*/
function unique(ary){
for(var i=0;i<ary.length-1;i++){
var getItem=ary[i];
for(var j=i+1;j<ary.length;j++){
var remainItem=ary[j];
// 如果当前项和后面的项在进行比较的时候,相同就说明重复,要删除掉原数组的那项
if(getItem==remainItem){
ary.splice(j,1);//此处splice会出现数组塌陷
//在本循环中,出现了相同项,删除后,后面的项会向前移动,但此时的j++,仍然增加,就会跳过前进的哪一项,造成数组塌陷
j--;
}
}
}
return ary;
}
console.log(unique(ary));
二、方法二
【实现的思路】
利用对象属性名不重复的思想,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项。
示例代码
/*
var ary2=[1,2,1,3,3,2,3];
利用对象属性名不能重复的原理:对象中如果没有一个属性的时候就是undefined
把数组中的每一项作为一个对象的属性名和属性值
var obj={1:1,2:2,3:3}
原理:如果对象属性中已经存在这个属性名,我们就把原数组中此项进行删除
*/
function unique(ary){
var obj={};
for(var i=0;i<ary.length;i++){
var item=ary[i];
if(typeof (obj[item])!="undefined"){
//如果此时对象的此属性已经有了,我们就应该删除数组中的那一项
ary.splice(i,1);
i--;
continue;
}
obj[item]=item;
}
return ary;
}
var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);
此种方法,仍然会出现数组塌陷的问题。
对于数组塌陷,数组中后面所有的数字都要依次改变,这样比较耗性能,
【优化方法】:可以让后面的索引值不变,这样就可以省性能。
- 把最后一项的值拿过来,占位到塌陷的此项
- 把最后一项删除
- 需要注意,此时最后一项也需要比较所以还需要i--
优化后代码
var ary=[1,2,3,2,3];
var obj={};
for(var i=0;i<ary.length;i++){
var item=ary[i];
if(typeof obj[item]!=="undefined"){
// 把当前重复的项替换成最后一项
ary[i]=ary[ary.length-1];
// 最后一项都已经拿过来了,多余,所以删除掉
ary.length--;
// 此时占位的这一项(最后一项)还没有比较,所以需要i--,再重新比较一次
i--;
continue;
}
obj[item]=item;
}
console.log(ary);
三、方法三:indexOf
【实现的思路】
创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去.
示例代码
/*
var ary2=[1,2,1,3,3,2,3];
var newAry=[];
把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组
*/
function unique(ary){
var newAry=[];
for(var i=0;i<ary.length;i++){
var item=ary[i];
if(newAry.indexOf(item)==-1){
newAry.push(item);
}
}
return newAry;
}
var ary2=[1,2,1,3,3,2,3];
var res=unique(ary2);
console.log(res);
四、结语
创作不易,留下你的足迹吧~