美文网首页
js 数组去重方法对比

js 数组去重方法对比

作者: sunshineLWZL | 来源:发表于2019-04-20 15:00 被阅读0次

    1 最简单方法

    // 判断值是否在数组中,如果不在则加入,ie8不支持 indexOf, O(n2)
    function uniq (arr) {
      let result = []
      for (let i = 0, len = arr.length; i < len; i++) {
         if (result.indexOf(arr[i] < 0) {
            result.push(arr[i])
         }
      }
      return result
    }
    

    2 使用 Map 保存

      // 使用额外的内存保存,速度快,由于 map 的key 值不区分类型,会将不同类型的值作为相同的值处理,因此需要额外保存类型, 接近 O(n)
      function uniq (arr) {
         let result = []
         let map = {}
         for (let i = 0, len = arr.length; i < len; i++) {
           const item = arr[i]
           const type = typeof item
           if (!map[item]]) {
             result.push(item)
             map[item] =[ type]
           } else if (map[item].indexOf(type) < 0) {
            result.push(item)
            map[item].push(type)
          }
         }
        return result
      }
    

    3 数组排序,只添加前面不同的值

    // 会打乱原数组顺序,只能去除同类型的值 o(nlogn)
    function uniq (arr) {
      if (arr.length <= 1) return arr 
      arr.sort()
      let result = [arr[0]]
      for (let i = 1, len = arr.length; i < len; i++) {
        if (arr[i] !== arr[i-1]) result.push(arr[i])
      }
      return result
    }
    

    4 数组下标法

    // 只将第一次出现加入新数组 O(n2)
    function uniq (arr) {
      let result = []
      for (let i = 0, len = arr.length; i < len; i++) {
        const item = arr[i]
        if (arr.indexOf(item) === i) result.push(arr[i])
      }
      return result
    }
    

    5 将最后出现的值加入数组

    function uniq (arr) {
      let result = []
      let len = arr.length
      for (let i = 0; i < len; i++) {
        for (let j = i +1; j < len; j++) {
          if (arr[i] === arr[j] {
           i++
           j = i
         }
        }
        result.push(arr[i])
      }
      return result
    }
    

    6 ES6

    function uniq (arr) {
      return Array.from(new Set(arr))
    }
    

    7 filter 实现

    // 与方法四相同
    function uniq (arr) {
      return arr.filter((item, index) => arr.indexOf(item) === index))
    }
    

    相关文章

      网友评论

          本文标题:js 数组去重方法对比

          本文链接:https://www.haomeiwen.com/subject/nbakgqtx.html