zoukankan      html  css  js  c++  java
  • JS数组去重的三种方法

    感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084.html

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容
    ============感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7084/

    JS中数组去重的三种方法

    数组去重的方式有很多种,我们先拿出3种比较简单的进行学习;

    • 1.双FOR循环(拿当前项和后面的每一项进行比较,重点:数组塌陷和SPLICE删除的优化)
    • 2.对象的键值对方式
    • 3.indxOf检测的方式

    思维导图

    JS中数组去重的三种方法

    一、双FOR循环方式

    原理:依次遍历数组中的每一项,拿当前项和其“后面”的每一项进行比较,如果后面中有和他相同的,则说明这项是重复的,我们把后面中重复的这一项删除掉即可

    let arr = [1, 1, 1, 2, 2, 3, 2, 2, 1, 2, 3, 2, 1, 2, 2, 3];  
    //====外层循环控制每一次拿出一项和其后面的比  
    //  i < arr.length - 1 最后一项不需要再拿出来了,因为每一次都是和当前项后面的比较,而最后一项后面没有任何的东西,所以也就没有必要再拿出来比较了  
    for (let i = 0; i < arr.length - 1; i++) {  
        // 每一次拿出来要和后面依次比较的那一项  
        let item = arr[i];  
        //====里层循环控制和当前项后面的每一项逐一比较  
        // let j = i + 1 从当前项的后一项开始逐一比较即可  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
            // 当前项和后面中的某一项相等了,此时我们把后面中的这一项从原始数组中删除掉  
            arr.splice(j, 1);  
          
            j--; //=>删除完,先让j--,然后在j++,相当于没加没减,下一轮还是从当前索引开始比较,这样防止数组塌陷带来的问题  
            }  
        }  
    }  
    复制代码
    

    1、用splice删除需注意的两点:

    • 第一点:数组塌陷问题:以用--解决

    解决完splice引起的塌陷问题后我们已经可以实现想要的效果,但是根据上图我们可以知道,

    在删除重复项后后面每一项的索引都会向前提一位,这样(如果删除的这一项后面还有1000万项,那么这1000万项的索引都要向前提一位)会大大的消耗性能, 所以我们需要做进一步的优化处理;

    • 第二点:性能优化

    JS中数组去重的三种方法

    2、优化后的代码如下:

    for (let i = 0; i < arr.length - 1; i++) {  
        let item = arr[i];  
        for (let j = i + 1; j < arr.length; j++) {  
            if (item === arr[j]) {  
                // 用最后一项替换当前项  
                arr[j] = arr[arr.length - 1];// 原始数组中的顺序会变化,但是不会导致索引前置这种情况(性能好)  
                // 最后一项删掉  
                arr.length--;  
                // 下一轮还和这一项比(因为这一项已经变为最新的最后一项了)  
                j--;  
            }  
        }  
    }  
    console.log(arr);  
    复制代码
    

    二、对象键值对的方式

    原理:利用对象中属性名不能重复的特点,先建立一个空对象,然后依次循环数组中的每一项,把此项作为obj对象的属性名和属性值,在添加的时候,如果这个属性名对应的值已经存在,说明此项重复,删除掉此项

    let arr = [1, 2, 3, 1, 1, 4, 2, 3];  
    let obj = {};  
    for (let i = 0; i < arr.length; i++) {  
        // 把每一次循环得到的当前项,作为对象的属性名和属性值存储进去  
        let item = arr[i];  
        if (obj[item] !== undefined) {  
            // 证明对象中有这个属性(也就是之前存储过,数组中之前就有这个值),当前值是重复的,我们需要把当前这项的值删掉即可  
            arr[i] = arr[arr.length - 1];  
            arr.length--;  
            i--;  
            continue;  
        }  
        obj[item] = item;  
    }  
    console.log(arr);  
    复制代码
    

    JS中数组去重的三种方法

    对象键值对的方式的优缺点

    • 优点: 只有一个循环,所以性能很好
    • 缺点: 1.如果数组中出现对象则存在问题(因为对象的属性名不能是对象,遇到会转换为字符串); 2.如果数组中存在数字10和字符串'10',则也会认为是重复的(对象中的属性名是数字和字符串没啥区别); 3.数组中的值如果是undefined可能也会出现问题....

    三、indxOf检测的方式

    原理:创建一个新数组,遍历原数组,如果新数组中没有那一项的话,就把它push进去

    let arr=[1,2,1,3,3,2,3];  
    let newAry=[];  
      /*把原数组中的每一项,只要在新数组中没存在过,我们就把它放进去,最后newAry就是咱们最终要的数组*/  
        
    for(let i=0;i<arr.length;i++){  
           let item=arr[i];  
           if(newAry.indexOf(item)==-1){  
            newAry.push(item);  
           }  
       }  
    arr = newAry;  
    console.log(arr);  
    复制代码
    

    缺点:indexOf低版本浏览器不兼容

    四、ES6利用Set方式

    /* ES6中没有提供现成的去重办法,但是提供了一些去重的方式 :Set数据结构*/  
    let obj = { y: 200 };  
    let arr = [obj, 1, 2, 3, 1, obj, 1, 4, 2, 3, '3', { x: 100 }, { x: 100 }];  
    arr = Array.from(new Set(arr));  
    console.log(arr);  
    复制代码
    

    缺点:低版本浏览器不兼容

  • 相关阅读:
    Atitit 集团与个人的完整入口列表 attilax的完整入口 1. 集团与个人的完整入口列表 1 2. 流量入口概念 2 3. 流量入口的历史与发展 2 1.集团与个人的完整入口列表
    atitit 每季度日程表 每季度流程 v3 qaf.docx Ver history V2 add diary cyar data 3 cate V3 fix detail 3cate ,
    Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言 1 1.1. 资料数量在百度内的数量对比 1 1.2. 版本16 v15.6.1 1 1.3. 引入js 2
    Atitit r2017 r3 doc list on home ntpc.docx
    Atitit r2017 ra doc list on home ntpc.docx
    Atiitt attilax掌握的前后技术放在简历里面.docx
    Atitit q2016 qa doc list on home ntpc.docx
    Atitit r7 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0D3C8 D:\ati\r2017 v3 r01\
    Atitit 可移植性之道attilax著
    Atitit q2016 q5 doc list on home ntpc.docx
  • 原文地址:https://www.cnblogs.com/lihanlin/p/12581993.html
Copyright © 2011-2022 走看看