• 简单类型数组去重的若干方法


    var arr = [1, 3, 5, 2, 2, 5, 6, 7, 8, 3, 4, 5, 6, 8, 9, 6]

    1. 利用两个数组,遍历源数组和目标数组中,目标数组中存在这个元素,则不添加, 不存在则添加
     function uniqueArr(array) {
          var _arr = [],
            isRepeat;
          for(var i = 0; i < array.length; i++) {
            isRepeat = false;
            for(var j = 0; j < _arr.length; j++) {
              if(_arr[j] == array[i]) {
                isRepeat = true;
                break;
              }
            }
            if(!isRepeat) {
              _arr.push(array[i])
            }
          }

          return _arr;
        }
    2. 双重遍历原数组,第一层遍历所有的,第二层从i+1开始遍历, 第二层的数组不存在与第i位重复的,则将这个元素存到目标数组中
        function uniqueArr(array) {
          var _arr = [],
            isRepeat;
          for(var i = 0; i < array.length; i++) {
            isRepeat = false;
            for(var j = i + 1; j < array.length; j++) {
              if(array[j] == array[i]) {
                isRepeat = true;
                break;
              }
            }
            if(!isRepeat) {
              _arr.push(array[i])
            }
          }

          return _arr;
        }
    3. 利用数组的filter方法和indexOf方法,这个方法非常巧妙,indexOf会返回这个元素第一次出现的下标,如果这个下标刚好为filter遍历的index, 则说明这个元素第一次出现,可以返回
        function uniqueArr(array) {
          return array.filter((item, index) => array.indexOf(item) === index)
        }

        function uniqueArr(array) {
          var _arr = [];

          array.forEach(item => {
            if(_arr.indexOf(item) < 0) {
              _arr.push(item)
            }
          });

          return _arr;
        }

    4. 利用sort和遍历,先将数组排序,排序后的数组,相同的元素会排在一起,我们只要找出相邻的元素为不同的元素,将左边的元素push到目标数组中则可以。
        function uniqueArr(array) {
          var _arr = [];
          array.sort();
          for(var i = 0; i < array.length; i++) {
            if(array[i] !==array[i+1]) {
              _arr.push(array[i])
            }
          }
          return _arr;
        }

    5. 利用sort和遍历,先将数组排序,排序后的数组,相同的元素会排在一起, 我们遍历原数组中,找出和目标数组中最后一位不同的元素就可以了
        function uniqueArr(array) {
          var _arr = [];
          array.sort();
          for(var i = 0; i < array.length; i++) {
            if(array[i] !== _arr[_arr.length - 1]) {
              _arr.push(array[i])
            }
          }
          return _arr;
        }

        // es6 
    indexOf和includes区别:
    indexOf: 返回元素位置,对NaN无效, eg: arr = [1, NaN, 2], arr.indexOf(NaN) // -1
    includes:返回true和false
    6. 利用es6的includes方法, 遍历原数组,将不存在于目标数组中的元素push进目标数组中就可以
        function uniqueArr(array) {
          var _arr = [];

          array.forEach(item => {
            if(!_arr.includes(item)) {
              _arr.push(item)
            }
          })
          return _arr;
        }
    7. 先用sort排序,通过数组的reduce方法归纳数组,将prev数组的最后一位与原数组比较, 不同就可以留下,这个方法与方法5类似
    function uniqueArray(array) {
      array.sort()
      return array.reduce((prev, item, index) => {
        if (prev[prev.length - 1] !== item) {
          prev.push(item);
        }
        return prev;
      }, [])
    }
    
    8. 利用map的string key的唯一性,将数组元素作为map的key去重 function uniqueArray(array) {
    var _arr = [], map = new Map(); for (var i = 0; i < array.length; i++) { if (!map.get(array[i])) { map.set(array[i], 1) _arr.push(array[i]) } } return _arr }
    9. 利用object的string key的唯一性,将数组元素作为map的key去重 function uniqueArray(array) {
    var _arr = [], obj = {}; for (var i = 0; i < array.length; i++) { if (!obj[array[i]]) { obj[array[i]] = 1; _arr.push(array[i]) } } return _arr } 10. 利用set的元素唯一性,set中没有重复的元素 function uniqueArray(array) { return Array.from(new Set(array)) } console.log(uniqueArray(arr))
  • 相关阅读:
    51nod1693 水群
    51nod 1158 全是1的最大子矩阵
    poj1192 最优连通子集(树形dp)
    51nod 1051 最大子矩阵和(dp)
    codeforces723 D. Lakes in Berland(并查集)
    51nod 1065 最小正子段和
    poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)
    51nod 1050 循环数组最大子段和
    hdu4781 Assignment For Princess(构造)
    51nod 1043 幸运号码(数位dp)
  • 原文地址:https://www.cnblogs.com/ycherry/p/15150889.html
Copyright © 2020-2023  润新知