数组去重

215 阅读1分钟
  1. 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,则直接被删除

  1. 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,但去重不了对象

  1. 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构造函数的键支持多种数据类型,适用面广

缺点:依然不能对象去重