四种方法都需要借助一个临时数组,并最终返回这个临时数组。
(一)使用方法indexOf
判断当前元素是否已经存在于临时数组中,如果不存在(结果返回-1),则push到临时数组中。
function removeDuplicatedItem1(arr){
var retArr=[];
for(var i=0;i<arr.length;i++){
if(retArr.indexOf(arr[i])===-1){//===判断值与类型是否完全相等,若类型不同也算不同的元素
retArr.push(arr[i]);
}
}
return retArr;
}
(二)利用对象属性的唯一性,把数组元素作为临时创建的一个对象的属性,若不存在则push
function removeDuplicatedItem2(arr){
var temp={};//创建的一个临时对象,用于存储数组元素作为其属性
var retArr=[];
for(var i=0;i<arr.length;i++){
if(!temp[arr[i]]){//判断属性是否存在,当然也可以判断当前属性是否等于1
temp[arr[i]]=1;//给当前属性值赋值,避免为空
retArr.push(arr[i]);
}
}
return retArr;
}
(三) 使用forEach
和indexOf
相结合,判断当前元素的下标值与indexOf
返回的结果是否一致,若一致说明当前元素是第一次出现,则push到临时数组中
function removeDuplicatedItem3(arr){
var retArr=[];
arr.forEach(function(item,i,ar){
if(arr.indexOf(item)==i){//判断当前元素是否是第一次出现
retArr.push(item);
}
});
return retArr;
}
(四)先对原数组排序,可以使用sort
,因为只是让相同的元素聚集到一起,对于排序规则没有要求。用一个临时变量temp
存储当前刚push进临时数组的item,数组指针后移,如果此时指针所指的item与temp
不相等,则push到临时数组中,否则,指针接着后移,直到原数组结束。
function removeDuplicatedItem4(arr){
if(arr.length<=0){//提前判断数组中是否有元素,防止数组越界
return -1;
}
var retArr=[];
arr.sort();
var nowItem=arr[0];//初始值存储原数组中的第一个元素
retArr.push(nowItem);
for(var i=1;i<arr.length;i++){
if(arr[i]!=nowItem){
retArr.push(arr[i]);
nowItem=arr[i];//改变nowItem的值
}
}
return retArr;
}