• JS算法入门(1)-去重


    前言

    开发中,经常会遇到对一个数组重复的元素进行去重处理,这里简单介绍5种方案

    1.先排序,再利用正则相邻比较

     1 let arr = [12,23,12,15,25,23,25,14,16]
     2 
     3 /*
     4  方法1:先排序,再利用正则相邻比较
     5  */
     6 arr.sort((a,b) => a-b)
     7 let str = arr.join('@') + '@' // str: 12@12@14@15@16@23@23@25@25@
     8 let reg = /(d+@)1*/g,
     9     ary = [];
    10 str.replace(reg, (n,m) => {
    11 //    console.log(n,m);  
    12    m = Number(m.slice(0,m.length - 1)) //截取 去掉每一项的@ 并转换为数字
    13    ary.push(m)  //添加到新数组
    14 })
    15 console.log(ary); //[ 12, 14, 15, 16, 23, 25 ]

    2.ES6中的Set方法

    1 /*
    2  方法2:Set方法  
    3 */
    4 arr = [... new Set(arr)]
    5 console.log(arr);  //[ 12, 23, 15, 25, 14, 16 ]

    3.拿出当前项和后面的内容进行比较

    1 for(let i = 0; i< arr.length - 1; i++){
    2     let current = arr[i],  //当前项
    3          res = arr.slice(i+1) //剩余数组内容
    4          if(res.includes(current)){
    5             arr[i] = null
    6          }
    7 }
    8 arr = arr.filter( item=> item != null)
    9 console.log(arr);

    下面的写法会出现数组塌陷,所以需要注意:

     1 for(let i = 0; i< arr.length - 1; i++){
     2     let current = arr[i],  //当前项
     3          res = arr.slice(i+1) //剩余数组内容
     4          if(res.includes(current)){
     5             arr.splice(i,1) //容易造成数组塌陷
     6          }
     7          i-- //改变数组每一项的索引,会导致性能问题
     8 }
     9 // arr = arr.filter( item=> item != null)
    10 console.log(arr);

    4. 键值对方法:那数组中的每项想形容中存储,如果已经存储过了,把当前项干掉

     1 * 
     2  方法4:键值对方法:那数组中的每项想形容中存储,如果已经存储过了,把当前项干掉
     3  */
     4 let obj = {};
     5 for(let i=0;i<arr.length;i++){
     6     let item = arr[i];
     7     if(typeof obj[item] !== 'undefined'){//对象obj中存在item属性
     8         arr[i] = arr[arr.length-1]
     9         arr.length--;
    10         i--;
    11         continue;
    12     }
    13     obj[item] = item; //将该项的作为键值对
    14 }
    15 obj = null  //释放对象地址
    16 console.log(arr); //[12, 23, 16, 15, 25, 14]
  • 相关阅读:
    JS闭包应用-私有变量、柯里化、偏函数
    JS限流与防抖
    JS自定义事件与事件代理
    CSS 去除图片和父元素底部间隙
    logstash使用http收集日志送Kafka
    shell中if条件语句结尾fi前面如果有&可以没有;
    filebeat 采集日志送Kafka
    JavaScript通过reduce+递归实现树的深度遍历
    WebStorm配置vueCli+eslint+prettier保存自动格式化
    ECMAScript 6 promise
  • 原文地址:https://www.cnblogs.com/yjiangling/p/13937668.html
Copyright © 2020-2023  润新知