- indexOf去重
let array = [1,5,2,3,4,2,3,1,3,4]
function unique(arr){
let arr1=[]
for(let i=0;i<arr.length;i++){
if(arr1.indexOf(arr[i])===-1){
arr1.push(arr[i])
}
}
return arr1
}
unique(array); //[1,5,2,3,4]
优点:基本所有浏览器都兼容,原理简单清晰
缺点:代码多,不能去重对象和NaN
function unique(arr){
return Array.prototype.filter.call(arr, function(item, index){
return arr.indexOf(item) === index;
})
}
优点:用到了filter()API,简化了代码
缺点:不能去重对象,如果数组里有两个NaN,则直接被删除
- Set实现
let array = [1,5,2,3,4,2,3,1,3,4]
function unique(arr){
return Array.from(new Set(arr))
}
unique(array); // [1, 5, 2, 3, 4]
优点:代码简洁,Set是ES6新的数据结构
缺点:部分浏览器还不兼容,去重了NaN,但去重不了对象
- Map 数据结构
let array = [1,5,2,3,4,2,3,1,3,4]
function unique(arr) {
let map = new Map();
let arr1 = []
for (let i = 0; i < arr.length; i++) {
if(map .has(arr[i])) { // 如果有该key值
map .set(arr[i], false);
} else {
map .set(arr[i], true); // 如果没有该key值
arr1 .push(arr[i]);
}
}
return arr1 ;//[1, 5, 2, 3, 4]
√.Map对象的键值不单指字符串,可以是任意数据类型;甚至任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。
√.map.set(key,value) //设置键值对,若重复设置键值,会将之前的值覆盖
√.map.get(key) //获取对应键的值
√.map.has(key) //判断map是否有该键值,ture/false
√.map.delete(key) //删除键值
优点:Map构造函数的键支持多种数据类型,适用面广
缺点:依然不能对象去重