zoukankan      html  css  js  c++  java
  • 超实用的JS数组去重

    一、简单的去重方法,利用数组indexOf方法

    // 最简单数组去重法
    /*
    * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中
    * IE8以下不支持数组的indexOf方法
    * */
    let ary = [1, 2, 3, 2, 2, 3, 4, 3, 4, 5];
     // 数组去重
    function unique(ary) {
       let newAry = [];
       for (let i = 0; i<ary.length; i++) {
          if (newAry.indexOf(ary[i]) === -1) {
            newAry.push(ary[i]);
          }
       }
       return newAry;
    }
    array = unique(ary);
    console.log(array);

    二、优化遍历数组法

    /*==数组去重==*/
    let ary = [1, 2, 3, 2, 2, 3, 4, 3, 4, 5];
    /*
     * 1.依次拿出数组中的每一项(排除最后一项:最后一项后面没有需要比较的内容)
     * 2.和当前拿出项后面的每一项依次比较
     * 3.如果发现有重复的,我们把找到的这个重复项在原有数组中删除掉(splice)
     */
    //=>i<ary.length-1:不用拿最后一项
    for (let i = 0; i < ary.length - 1; i++) {
        let item = ary[i];
        //=>item:依次拿出的每一项
        //=>i:当前拿出项的索引
        //=>和当前项后面的每一项比较:起始索引应该是i+1  k < ary.length找到末尾依次比较
        for (let k = i + 1; k < ary.length; k++) {
            //ary[k]:后面需要拿出来和当前项比较的这个值
            if (item === ary[k]) {
                //=>相等:重复了,我们拿出来的K这个比较项在原有数组中删除
                // ary.splice(k, 1);
                /*
                 * 这样做会导致数组塌陷问题:当我们把当前项删除后,后面每一项都要向前进一位,也就是原有数组的索引发生了改变,此时我们k继续累加1,下一次在拿出来的结果就会跳过一位
                 * 原数组 [1,2,3,4]
                 * i=1 =>2 我们把这一项干掉,然后i++,i=2
                 * 原数组 [1,3,4]
                 * i=2这一项是4,3这一项就错过了
                 * ...
                 */
                ary.splice(k, 1);//=>删除后不能让k累加了
                k--;//=>删除后先减减,在加加的时候相当于没加没减
            }
        }
    }
    console.log(ary);

    三、对象键值法去重

    let ary = [1, 2, 3, 2, 2, 3, 4, 3, 4, 5];
    // 使用对象属性名不重复的特点去重
        let obj={};
        let newAry = [];
        for (let i=0; i<ary.length; i++) {
          let item = ary[i];
          if (typeof obj[item] === 'undefined') {
            // 如果obj[item]是undefined说明对象obj中还未存入键值item,我们向newAry中加入item
            newAry.push(item)
          }
          obj[item] = item;
        }
        ary = newAry
        console.log(ary)

    四、ES6中Set方法去重

    let ary = [1, 2, 2, 2, 1, 2, 3, 2, 3, 2, 1],
    console.log(Array.from(new Set(ary)));  //=>基于ES6 SET实现去重
    或者console.log([...new Set(ary)]);

    我用let代替了var声明变量,还未学ES6的同学用var可以实现,不影响功能实现~

  • 相关阅读:
    【Java】基本类型和引用类型(值传递)
    Linux学习笔记:什么是x86
    Java volatile keyword
    C语言可变參实现參数累加返回
    [Network]Application Layer
    linux下select,poll,epoll的使用与重点分析
    卷积神经网络(CNN)基础介绍
    ScrollView嵌套ExpandableListView显示不正常的问题
    【leetcode】 Unique Binary Search Trees II (middle)☆
    【leetcode】 Unique Binary Search Trees (middle)☆
  • 原文地址:https://www.cnblogs.com/jiajialove/p/11008752.html
Copyright © 2011-2022 走看看