• 数组去重的几种方式


    1.reduce实现数组去重

    var myArray = [1,2,2,3,4,4];
    var myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
        //accumulator有初始值 赋值为空数组   空数组中没有1 indexOf为-1 进入循环   
        console.log(accumulator.indexOf(currentValue) )
      if (accumulator.indexOf(currentValue) === -1) {
          //[1] => 在执行 数组变为[1,2]  indexOf 是返回数组当前值得下标 2第一次进去得时候不存在是-1进入循环
          //push进去数组 第二个2存在 返回下标 return出去 以此类推 实现数组去重
        accumulator.push(currentValue);
      }
      return accumulator
    }, [])
    console.log(myOrderedArray);
    ================================================================
    let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
    let result = arr.sort().reduce((init, current) => {
        if(init.length === 0 || init[init.length-1] !== current) {
            init.push(current);
        }
        return init;
    }, []);
    console.log(result); //[1,2,3,4,5]
    

    2.includes 去重

    let myArray = [1, 2, 2, 3, 4, 4];
    let newArr = [];
    for (let i = 0; i < myArray.length; i++) {
        let item = myArray[i];
        //验证新数组中是否存在这一项
        if(newArr.includes(item)){continue}
        //新数组中不存在这一项,直接加入到新数组中
        newArr.push(item)
    }
    console.log(newArr) //原数组未去重,新数组去重了
    
    ======================================================================
    let myArray = [1, 2, 2, 3, 4, 4];
    let newArr = [];
    myArray.forEach((item)=>{
         //验证新数组中是否存在这一项
        if(newArr.includes(item)){
            return
        }
        newArr.push(item)
    })
    console.log(newArr) //原数组未去重,新数组去重了
    //ie  6 7 8 不兼容
    

    3.双重for循环去重

    一张图了解数组塌陷问题

    function unique(arr){      
            for(var i=0; i<arr.length; i++){
               //让当前项和后面一项进行比较(循环);
                for(var j=i+1; j<arr.length; j++){
                    if(arr[i]==arr[j]){         //第一个等同于第二个,splice方法删除第二个
                        arr.splice(j,1);
                        j--;//数组塌陷了 j后面得每一项索引都提前了一位,下一次要比较得应该还是j这个索引得内容
                    }
                }
            }
    return arr;
    }
    

    4.indexOf去重

    function bb(arr){
        let newArr = [];
        for(let i = 0;i<arr.length;i++){
            if(newArr.indexOf(arr[i]) === -1){
                newArr.push(arr[i])//indexOf  不存在返回-1  满足条件加进去
            }
        }
        return newArr;
    }//ie  6 7 8 不兼容function bb(arr){
        let newArr = [];
        for(let i = 0;i<arr.length;i++){
            if(newArr.indexOf(arr[i]) === -1){
                newArr.push(arr[i])//indexOf  不存在返回-1  满足条件加进去
            }
        }
        return newArr;
    }//ie  6 7 8 不兼容
    

    5.对象去重

        let arr = [1, 2, 2, 1, 3, 5,6,25];
        let obj = {};
        let newArr = [];
        for (let i = 0; i < arr.length; i++) {
            //对象获取数字对象  用中括号得方法
            if (obj[arr[i]] === arr[i]) {
                //说明值已经存在
                arr.splice(i,1); 
                i--;    //数组塌陷问题 索引向前提一位
                continue
            } else {
                obj[arr[i]] = arr[i]  //对象赋值
                newArr.push(arr[i])
            }
        }
        console.log(obj)// {1: 1, 2: 2, 3: 3, 5: 5, 6: 6, 25: 25}
        console.log(newArr)// [1, 2, 3, 5, 6, 25] 
    //缺陷  对象类得值不能处理
    ============================较好的方法 不使用splice数组去重=====================
      let arr = [1, 2, 2, 1, 3, 5, 6, 25];
    let obj = {};
    let newArr = [];
    for (let i = 0; i < arr.length; i++) {
      if (obj[arr[i]] === arr[i]) {
        arr[i] = arr[arr.length - 1];
        arr.length--;
        i--;
        continue
      } else {
        obj[arr[i]] = arr[i]
        newArr.push(arr[i])
      }
    }
    ==============封装函数方式=======================================
      function uniue(arr) {
      let obj = {};
      let newArr = [];
      for (let i = 0; i < arr.length; i++) {
        if (obj[arr[i]] === arr[i]) {
          //如果已经存在 将数组的最后一位移到当前位置
          arr[i] = arr[arr.length - 1]; 
          arr.length--; //然后 删除最后一项
          i--;  //并将对应得数组长度-1
          continue
        } 
        newArr.push( arr[i])
        obj[arr[i]] = arr[i];
      }
      return newArr;
    }
    let arr1 = [1, 2, 2, 1, 3, 5, 6, 25];
    ;
    console.log(uniue(arr1))
    

    6.ES6 Set去重

     let arr1 = [1, 2, 2, 1, 3, 5, 6];
     let arr = [...new Set(arr1)];
     console.log(arr)  // [1, 2, 3, 5, 6]
    

    7.在原型上封装去重

    8.利用Map

    const unique5 = arr => {
      const map = new Map();
      const res = [];
      for (let i = 0; i < arr.length; i++) {
        if (!map.has(arr[i])) {
          map.set(arr[i], true)
          res.push(arr[i]);
        }
      }
      return res;
    }
    
    

    9.利用filter

    const unique4 = arr => {
      return arr.filter((item, index) => {
        return arr.indexOf(item) === index;
      });
    }
    
    
  • 相关阅读:
    说说C#的数学类,Math,浮点数(上)
    Activity设置切换动画时黑屏问题的解决
    機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现
    Hadoop简单介绍
    Hdu 2018 母牛的故事
    object hook实现禁止创建文件
    django 查询如何使用 or
    Python 实现字符串转换成列表 实现str转换list
    django如何修改开发服务器的端口
    如何修改Linux系统的 /etc/ssh/sshd_config 文件 "/etc/ssh/sshd_config" E212: Can't open file for writin
  • 原文地址:https://www.cnblogs.com/loveliang/p/13667146.html
Copyright © 2020-2023  润新知