JavaScript数组去重-原生三种方式

268 阅读3分钟
根据各位大佬的建议,再来三种原生去重方式

把数组中的重复项去除掉。比如:[1, 1, 1, 2, 2, 1, 2, 3, 3, 1, 3] => [1, 2, 3]

利用数组indexOf去重

indexOf 查找某一项在数组中首次出现的索引位置。返回-1说明数组中不存在这一项。

    // 利用indexOf()
    var arr = [1, 1, 1, 2, 2, 2, 1, 2]

    // 准备一个新的空数组
    var newArr = []
    for (var i = 0; i < arr.length; i++) {
      var cur = arr[i]

      // 如果新数组里,还没有当前这一项 就将它添加到新数组里
      if (newArr.indexOf(cur) === -1) {
        newArr.push(cur)
      }
    }
    console.log(newArr) // [1, 2]

函数封装

将上面代码封装到函数里,便于给其他数组去重复用

    // 为了能够复用数组去重逻辑 封装到函数里
    function unique(ary) {
      var newArr = []
      for (var i = 0; i < ary.length; i++) {
        var cur = ary[i]

        // 如果新数组里,还没有当前这一项 就将它添加到新数组里
        if (newArr.indexOf(cur) === -1) {
          newArr.push(cur)
        }
      }
      return newArr
    }

    var arr1 = [1, 1, 1, 2, 2, 3, 3, 2]
    console.log(unique(arr1)) // [1, 2, 3]

    var arr2 = [3, 3, 5, 6, 5, 5, 6, 6]
    console.log(unique(arr2)) // [3, 5, 6]

利用对象去重

把对象当做记账本来使用,只要往空数组添加过,就在对象中把当前值当做属性标记为true。

    function unique(arr) {
      // 准备一个空对象 相当于记账本
      var obj = {}
      // 准备一个空数组 存放不重复的值
      var newArr = []
      for (var i = 0; i < arr.length; i++) {
        var cur = arr[i]

        // 每次循环判断下 在对象中是否存在当前项这个属性,不存在 则执行if语句中的添加逻辑
        if (!obj[cur]) { // 把当前值作为属性名来使用
          // 将当前项添加到新数组
          newArr.push(cur)
          // 同时在对象里 把当前项作为属性,标记为true,表示已经往新数组添加过了
          obj[cur] = true
        }
      }

      console.log(obj) // {1: true, 2: true, 3: true}
      console.log(newArr) // [1, 2, 3]

      // 去重完 对象已经没用 释放内存
      obj = null
      return newArr
    }
    var arr1 = [1, 1, 1, 2, 2, 3, 3, 2]
    console.log(unique(arr1)) // [1, 2, 3]

双循环去重

用当前项分别和后面每项进行比较,如果当前项和后面项 就将后面这一项删除掉(splice())

    function unique(arr) {
      // 外层循环每次负责取出一个当前项(比较项)
      for (var i = 0; i < arr.length - 1; i++) {
        var cur = arr[i]

        // 内层循环 负责将当前项后面的每一项(被比较项)依次取出来 与 当前项进行比较
        for (var j = i + 1; j < arr.length;) {

          // 如果当前项与后一项相等,说明重复了,就将后一项用splice删除
          // 用splice()删除中间某一项 会导致数组塌陷 删除项后面的每一项都会往前挪一位
          // 如果从当前索引j处 删除了一项后面的就会塌陷过来,就先不让j++ 再次从这个索引位置比较一次
          cur === arr[j] ? arr.splice(j, 1) : j++
        }
      }
      return arr
    }
    var arr1 = [1, 1, 1, 2, 3, 3, 2, 2, 1, 2]
    console.log(unique(arr1)) // [1, 2, 3]

----------------------------------------------------------------------------------------------------------------
参考文章&&强烈推荐:布罗利