常见方法
1.利用对象键值不能重复
2.es6做法:利用set集合中不能出现重复值,然后将伪数组转换成数组
3.利用filter函数
接下来讲讲具体实现
1.利用对象键值不能重复
function unique(arr) {
var ret = [];
var len = arr.length;
var tmp = {};
for(var i=0; i<len; i++){
if(!tmp[arr[i]]){
tmp[arr[i]] = 1;
ret.push(arr[i]);
}
}
return ret;
}
但由于对象key只能为字符串,因此这种去重方法有许多局限性:
- 无法区分隐式类型转换成字符串后一样的值,比如1和'1'
- 无法处理复杂数据类型,比如对象(因为对象作为key会变成[object Object])
- 特殊数据,比如'proto'会挂掉,因为tmp对象的proto属性无法被重写
对于第一点,有人提出可以为对象的key增加一个类型,或者将类型放到对象的value中来解决:
function unique(arr) {
var ret = [];
var len = arr.length;
var tmp = {};
var tmpKey;
for(var i=0; i<len; i++){
tmpKey = typeof arr[i] + arr[i];
if(!tmp[tmpKey]){
tmp[tmpKey] = 1;
ret.push(arr[i]);
}
}
return ret;
}
该方案也同时解决第三个问题。
而第二个问题,如果像上文所说,在允许对对象进行自定义的比较规则,也可以将对象序列化之后作为key来使用。这里为简单起见,使用JSON.stringify()进行序列化。
function unique(arr) {
var ret = [];
var len = arr.length;
var tmp = {};
var tmpKey;
for(var i=0; i<len; i++){
tmpKey = typeof arr[i] + JSON.stringify(arr[i]);
if(!tmp[tmpKey]){
tmp[tmpKey] = 1;
ret.push(arr[i]);
}
}
return ret;
}
2.es6做法
function uniqueArr(){
let arr = [1,2,2,3,3,3];
return Array.from(new Set(arr));
}
console.log(uniqueArr());//[1,2,3];
3.利用filter函数
function uniqueArr(){
let arr = [1,2,2,3,3,3];
//filter
return arr.filter(function(ele,index,array){
return array.indexOf(ele) === index;
})
}
console.log(uniqueArr());//[1,2,3];
每天都努力一点点
谢谢你看完