1. 嵌套循环 兼容性好
var distinct = function (arr){
var result = [];
result.push(arr[0]);//将数组中第一个元素放入
for(i=1;i<arr.length;i++){//减少一次循环
var flag = true;
for(j=0,j<result.length;j++){
if(arr[i]===result[j]){//若数组当前元素与result中重复
flag = false;
break;
}
}
if(flag){
result.push(arr[i]);
}
}
return result;
};
2. indexOf
不能判断是否有NaN的元素
var distinct = function (arr){
var result = [];
result.push(arr[0]);
for(i=1;i<arr.length;i++){
if(result.indexOf(arr[i])==-1){//result中没有该元素
result.push(arr[i]);
}
}
return result;
};
3. 对象属性唯一
var distinct = function (arr){
obj = {};
var result = [];
for(i=0;i<arr.length;i++){
if(!obj[arr[i]]){//对象属性唯一,===
obj[arr[i]] = 1;
result.push(arr[i]);
}
}
return result;
};
4. 原数组排序,相邻比较,splice删除重复的元素
var distinct = function (arr){
arr.sort();
var i=1;
while(i<arr.length){
if(arr[i-1]===arr[i]){//相邻元素全等
arr.splice(i-1,1);//去除前面的元素
}else{
i++;
}
}
return arr;
};
5. ES6, Set
Set数据结构,它类似于数组,其成员的值都是唯一的
- Array.from:将Set结构转换成数组
var distinct = function (arr){
return Array.from(new Set(arr));
};
var a = [1,'true',true,true,5,'F',false, undefined, null,null,undefined, NaN, 0, 1, 'a', 'a', NaN,'NaN'];
console.log(distinct(a));
- 拓展运算符(…)内部使用for…of循环,将Set结构转换成数组
var a = [1,'true',true,true,5,'F',false, undefined, null,null,undefined, NaN, 0, 1, 'a', 'a', NaN,'NaN'];
console.log([...new Set(a)]);
返回结果:
6.Array.prototype.includes()
includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
var distinct = function (arr){
var result = [];
result.push(arr[0]);
for(var i=1;i<arr.length;i++){
if(!result.includes(arr[i])){//判断是否重复
result.push(arr[i]);
}
}
return result;
};
还有很多….
参考:http://blog.csdn.net/zhalcie2011/article/details/72878559