js数组去重总结

删除数组条目中重复的条目(可能有多个),并返回去重后的新数组。

思路1:

定义一个新数组,并存放原数组的第一个元素,然后将原数组一一和新数组的元素对比,如果在新数组中不存在则存放在新数组中。

function unique(arr){
 var res = [arr[0]];
 for(var i=1; i<arr.length; i++){
  var repeat = false;
  for(var j=0; j<res.length; j++){
   if(arr[i] === res[j]){
    repeat = true;
    break;
   }
  }
  if(!repeat){
   res.push(arr[i]);
  }
 }
 return res;
}

思路2:

利用数组原型对象上的 splice 方法,将相同的值删除。

function unique(arr){
 var i,
  j,
  len = arr.length; 
 for(i = 0; i < len; i++){
  for(j = i + 1; j < len; j++){
   if(arr[i] == arr[j]){
    arr.splice(j,1);
    len--;
    j--;
   }
  }
 }
 return arr;
}

思路3:

与1类似,都是在数组循环中判断数组的值在新数组中是否存在,不存在则插入到新数组中。但是不需要用flag来标识是否存在,而是直接使用indexOf、lastIndexOf、includes来判断。

ps:如果数组中有NaN、undefined、-0和+0,必须使用includes,因为indexOf、lastIndexOf无法判断NaN和undefined是否存在,也无法判断-0等于+0。

  • includes 使用场景是返回值的语义化和 NaN和undefined、-0和+0判断。
function unique(arr){
 var res = [];
 for(var i=0; i<arr.length; i++){
  if(!res.includes(arr[i])){ // 如果res新数组包含当前循环item
   res.push(arr[i]);
  }
 }
 return res;
}
  • indexOf 和lastIndexOf使用场景是需要知道 匹配值的位置。
function unique(arr){
 var res = [];
 for(var i=0; i<arr.length; i++){
  if(res.indexOf(arr[i]) == -1){
   res.push(arr[i]);
  }
 }
 return res;
}

for循环也可以用filter和forEach代替:

function unique(arr){
 var res = [];
 res = arr.filter(function(item){
  return res.includes(item) ? '' : res.push(item);
 });
 return res;
}
function unique(arr){
 var res = [];
 arr.forEach(function(item){
  res.includes(item) ? '' : res.push(item);
 }); 
 return res;
}

思路4:

先将原数组排序,在与相邻的进行比较,如果不同则存入新数组。

function unique(arr){
 var arr2 = arr.sort();
 var res = [arr2[0]];
 for(var i=1; i<arr2.length; i++){
  if(arr2[i] !== res[res.length-1]){
   res.push(arr2[i]);
  }
 } 
 return res;
}

思路5: (推荐

哈希对象法,将数组中的值作为新对象的属性,在循环中判断数组的值在新对象的属性中是否存在,如果没有该属性则存入新数组。

function unique(arr){
 var res = [];
 var obj = {};
 for(var i=0; i<arr.length; i++){
  if(!obj[arr[i]]){
   obj[arr[i]] = 1;
   res.push(arr[i]);
  }
 } 
 return res;
}

思路6: (推荐

利用ES6新增的Set数据结构,类似于数组,但是里面的元素都是唯一的 ,其构造函数可以接受一个数组作为参数,然后利用ES6中Array新增的静态方法from,把被Set处理过后的类似数组的对象转换为数组。

function unique10(arr){
 return Array.from(new Set(arr)); // 利用Array.from将Set结构转换成数组
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值