数组去重

213 阅读4分钟

数组去重方法一(indexOf/includes)

返回新数组

  • 数组的indexOf()方法可返回某个指定的元素在数组中首次出现的位置。该方法首先定义一个空数组newArr,然后调用indexOf方法对原来的数组进行遍历判断,如果元素不在newArr中,则将其push进newArr中,最后将newArr返回 即可获得去重的数组
<script>
    // 把数组中重复项去掉
    // indexOf
    // 定义一个新数组 var newArr = []
    // 循环arr里面的每一项 var item = arr[i]
    // 判断新数组中是否已经存在 item newArr.indexOf(item) === -1
    // 如果不存在 再往里面添加  newArr.push(item)
   
    var arr = [1, 1, 1, 2, 3, 2, 3, 2, 3, 4, 4, 4]
    var arr2 = [10, 10, 10, 2, 3, 2, 3, 2, 3, 4, 4, 4]
    var arr3 = [100, 100, 100, 2, 3, 2, 3, 2, 3, 4, 4, 4]

    // 一次封装 多次复用
    // 想给谁去重 就把谁当做实参传递进来unique(arr) 用形参变量ary接收
    function unique(ary) {
      var newArr = [];
      for (var i = 0; i < ary.length; i++) {
        var item = ary[i];
        <!--三元运算符-->
        // newArr.indexOf(item) === -1 ? newArr.push(item) : void 0;
        // void 0 返回 undefined
        if (newArr.indexOf(item) === -1) {
          newArr.push(item);
        }
      }
      return newArr;
    }
    
    <!-- includes -->
    function unique1(ary) {
      var newArr = [];
      for (var i = 0; i < ary.length; i++) {
        var item = ary[i];
        <!--三元运算符-->
        // !newArr.includes(item) ? newArr.push(item) : void 0;
        // void 0 返回 undefined
        if (!newArr.includes(item)) {
          newArr.push(item);
        }
      }
      return newArr;
    }

   var a1 = unique1(arr);
   console.log('a1', a1);

   var a2 = unique(arr2);
   console.log('a2', a2);
  </script>

数组去重方法二

对象法去重 利用的是对象的属性名是唯一的

 <script>
   var arr = [1, 1, 2, 2, 3, 2, 3, 4, 4, 4]

   function unique(ary) {
     var newArr = []
     var obj = {}

     for (var i = 0; i < ary.length; i++) {
       var cur = ary[i]

       if (!obj[cur]) {
         newArr.push(cur)
         obj[cur] = true
       }

     }

     obj = null
     return newArr
   }

   var ary = unique(arr)
   console.log('ary', ary)


   //  var newArr = []
   //  var obj = {}

   //  for (var i = 0; i < arr.length; i++) {
   //    var cur = arr[i] // 1 1 2 2

   //   // 如果对象中不存在这个属性 说明我们没有添加过
   //   // !obj[1] => !true => false
   //   // !obj[2] => !undefined => true
   //   // !obj[2] => !true => false
   //    if (!obj[cur]) { 
   //      newArr.push(cur) // [1, 2]
   //      obj[cur] = true // {1: true, 2: true}
   //    }

   //  }
   //  console.log(newArr)

   //  // 由于这个对象没用了 通常我们会 释放内存
   //  obj = null
 </script>

双重循环去重

<script>
   // 外层循环出来每一个当前项cur, 内层循环循环出来当前项的每个后一项last

   // 用当前项cur和 每个后一项last 分别比较===
   // 如果有相同的(===) 就删除这一项 splice(j, 1)

   // var arr = [1, 1, 2, 2, 3, 2, 3, 4, 4, 4]

   // var arr = [1, 1, 1, 1]

   // cur = 1 (a)
   // // 内层循环 j = 0 + 1
   // last = 1 (b)

   // if cur === last
   // arr.splice(j, 1)
   // // [1, 1, 1] 

   // j++ // j = 2

   // // [1, 1, 1] 
   // // 内层循环第二次 j = 2
   // cur = 1 (0)
   // last = 1 (2)

   // if cur === last
   // arr.splice(j, 1)
   // // [1, 1] 

   // j++ // j = 3

   // 3 < 2 
   


  

   // 当我们用splice删除前面某一项时候 后面的就会往前挪一位,数组塌陷

   // 用于我们再删除的时候 后面的会往前挪一位
   // 我们需要再删除的时候 让我们再从当前这个索引位置比较一次

   // j = 1
   // var arr = [2, 2, 2, 2]
   // j = 1
   // j++ j = 2

   // for (var i = 0; i < arr.length - 1; i++) {
   //   // 当前项 i当前项索引
   //   var cur = arr[i]
   //   console.log('大循环cur', cur)
     
   //   // 把当前项cur的后一项依次取出来进行比较
   //   for (var j = i + 1; j < arr.length; j++) {
   //     var last = arr[j]

   //     // 数组中有和当前项 重复的值
   //     if (cur === last) {
   //       arr.splice(j, 1)
   //       j--
   //     }
   //   }
   // }



   // i++
   // i= i + 1
   //代码执行
   var arr = [2, 2, 2, 2]

   for (var i = 0; i < arr.length - 1; i++) {
     // 当前项 i当前项索引
     var cur = arr[i]
     console.log(i)
     console.log('大循环cur', cur)
     
     // 把当前项cur的后一项依次取出来进行比较
     for (var j = i + 1; j < arr.length;) {
       var last = arr[j]

       // 数组中有和当前项 重复的值 就删除这一项
       cur === last ? arr.splice(j, 1) : j++
       // if (cur === last) {
       //   arr.splice(j, 1)
       // } else {
       //   j++
       // }
     }
   }
   console.log(arr)

   for (var i = 0; i < arr.length - 1; i++) {
     var cur = arr[i]
   
     for (var j = i + 1; j < arr.length;) {
       cur === arr[j] ? arr.splice(j, 1) : j++
     }
   }
 </script>

set与解构赋值去重

ES6中新增了数据类型set,set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化,利用该特性也能做到给数组去重

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return [...new Set(arr)]
}

Array.from与set去重

Array.from方法可以将Set结构转换为数组结果,而我们知道set结果是不重复的数据集,因此能够达到去重的目的

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return Array.from(new Set(arr))
}

相邻元素去重

这种方法首先调用了数组的排序方法sort(),然后根据排序后的结果进行遍历及相邻元素比对,如果相等则跳过改元素,直到遍历结束

unction unique(arr) {
    // 判断是不是数组
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    // 先排序
    arr = arr.sort()
    let res = []
    // 遍历数组
    for (let i = 0; i < arr.length; i++) {
    // 判断是否相等
        if (arr[i] !== arr[i-1]) {
            res.push(arr[i])
        }
    }
    return res
}

indexOf方法去重2

利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等,如果不等则说明该元素是重复元素

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return Array.prototype.filter.call(arr, function(item, index){
        return arr.indexOf(item) === index;
    });
}