《 数组去重 》

135 阅读1分钟

方法

Set 去重

let arr = [1,1,5,5,7,8,7,8,9,'ture','ture',{},{}] 
function uniq (arr) {
  return Array.from( new Set(arr))
}
console.log(uniq(arr))
// [1, 5, 7, 8, 9, "ture", {…}, {…}]
// 使用 Set 方法所使用的代码最少,但是当有 {} 的时候会没有作用,无法去除 {} 空对象

for 嵌套 for ,然后 splice 去重

 let arr = [1,1,5,5,7,8,7,8,9,'ture','ture',{},{},null,null]
 function uniq(arr){            
    for(let i=0; i<arr.length; i++){
        for(let j=i+1; j<arr.length; j++){
            if(arr[i]===arr[j]){         // 两次遍历后,如果 arr[i] 等于 arr[j] 时,删除掉后者
                arr.splice(j,1);
                j--;
            }
        }
    }
  return arr;
}
console.log(uniq(arr))
// [1, 5, 7, 8, 9, "ture", {…}, {…}, null] // 同样的空 {} 还是无法去重
// 双层循环,外层循环元素,内层循环时比较值。值相同时,则删去后面这个值

indexOf 去重

 let arr = [1,1,5,5,7,8,7,8,9,'ture','ture',{},{},null,null]
  function uniq(arr) {
   if (!Array.isArray(arr)) {
      console.log('type error!')
      return
}
   let array = [];
     for (let i = 0; i < arr.length; i++) {
      if (array .indexOf(arr[i]) === -1) {
         array .push(arr[i])   
      }
   }
      return array;
}  
     console.log(uniq(arr))
    // [1, 5, 7, 8, 9, "ture", {…}, {…}, null] // 同样的没有去除掉 {} 
    // 新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。

利用对象的 hasOwnProperty 去重

 let arr = [1,1,5,5,7,8,7,8,9,'ture','ture',{},{},null,null]
    function uniq(arr) {
     let obj = {};
     return arr.filter(function (item, index, arr) {
     return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
  })
}
    console.log(uniq(arr))
    // [1, 5, 7, 8, 9, "ture", {…}, null] // 这种方法把 {} 也一样去重了
    // Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。

Map 去重

let arr = [1,1,5,5,7,8,7,8,9,'ture','ture',{},{},null,null]
function uniq(arr) {
 let map = new Map();
 let array = new Array();  // 数组用于返回结果
 for (let i = 0; i < arr.length; i++) {
    if (map.has(arr[i])) {  // 如果有该key值
        map.set(arr[i], true);
    } else {
        map.set(arr[i], false);   // 如果没有该key值
        array.push(arr[i]);
     }
 }
    return array;
}
 console.log(uniq(arr))
 // [1, 5, 7, 8, 9, "ture", {…}, {…}, null] // 同样的空 {} 还是没有被去重
 // map是ES提供的一种字典数据结构
字典结构——用来存储不重复key的hash结构。不同于集合(set)的是,字典使用的是键值对的形式来存储数据

本篇文章借鉴了这里 作为学习记录