zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    贪心经典例题大赏
    【暑假培训1】7.13
    【7.10校内test】T1高级打字机
    【7.10校内test】T3经营与开发
    【7.10校内test】T2不等数列
    【7.9校内test】T2 极值问题
    【7.9校内test】T1挖地雷
    <知识整理>2019清北学堂提高储备D5
    <知识整理>2019清北学堂提高储备D4
    <知识整理>2019清北学堂提高储备D2
  • 原文地址:https://www.cnblogs.com/yjiangling/p/13937668.html
Copyright © 2011-2022 走看看