最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 快乐Js之数组去重

    正文概述 掘金(溜溜球形废物)   2021-07-14   595

    快乐Js之数组去重

    我们在写业务代码的时候,经常会碰到给复杂数组去重的需求,那么如何帅气的实现数组去重呢?请你看完这篇文。

    简单数组去重

    饭要一口一口吃,先来看一个简单数组去重吧,鉴于网上数组去重的方法很多,这里只介绍几个我喜欢的。

    // 一个简单数组,包含的每一项都是简单类型的值
    const list = [11,11,33,2, 'true', true, undefined, null, null, false, 'false', false, NaN, NaN]
    
    // 利用set数据结构去重的特性,大家用的最多的应该就是这种吧
    const duplicateRemoval = list => Array.from(new Set(list))
    
    // for循环去重
    const duplicateRemoval = list => {
      const arr = []
      list.forEach(item => !arr.includes(item) && arr.push(item))
      return arr
    }
    
    // filter 函数去重
    const duplicateRemoval = list => {
      return list.filter((item, index, arr) => {
        //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
        return arr.indexOf(item) === index;
      });
    }
    // 让我们精简一下上面这个函数,很好,非常的完美
    const duplicateRemoval = list => list.filter((item, index, arr) => arr.indexOf(item) === index)
    
    // 使用reduce函数去重
    const duplicateRemoval = list => list.reduce((accumulator, currentValue) => {
      if (accumulator.indexOf(currentValue) === -1) {
        accumulator.push(currentValue)
      }
      return accumulator
    }, [])
    // 好的,按照惯例精简一下
    const duplicateRemoval = list => list.reduce((acc, cur) => (!acc.includes(cur) && acc.push(cur), acc),[])
    

    简单数组去重的写法太多啦,随便一搜就是十种八种的,鉴于我们的主题并不是简单数组去重,所以暂时就写到这吧~

    复杂数组按条件去重

    // 一个我们经常会碰到的对象数组,我们需要按照某个特定条件去除重复项
    const list = [{name: 'lily1', code: '133'},{name: 'lily1', code: '323'},{name: 'lily2', code: '333'},{name: 'lily3', code: '333'},{name: 'lily4', code: '332'},{name: 'lily4', code: '333'}]
    
    // 由于复杂数据结构的特性,我们无法再简单的使用set进行去重了
    
    // 利用filter函数去重
    const duplicateRemovalByFilter = (list, key) => {
      const map = {}
      return list.filter(item => {
        let value = item[key]
        // 还是比较好理解的,写一个map来记录筛选项出现的次数,然后当次数为1时返回true,这样筛选出来的就是在数组中只出现过一次的项了
        if(!map[value]) {
          map[value] = 1
        } else {
          map[value] += 1
        }
        return map[value] === 1
      })
    }
    // 按照惯例精简一下
    const duplicateRemovalByFilter = (list, key) => {
      const map = {}
      // 小知识 赋值语句的返回值等于被赋予的那个值
      // let a; // 返回undefined
      // a = 688; // 返回688
      return list.filter(item => !map[item[key]] && (map[item[key]] = true))
    }
    
    // 利用reduce函数去重
    const duplicateRemovalByReduce = (list,key) => {
      const obj = list.reduce((pre, cur) => {
        // 判断一下 累加器中对应的值是否为undefined,是的话赋上当前的值,不是的话,就保持现状
        pre[cur[key]] = pre[cur[key]] || cur
        return pre
      }, {})
      // 返回obj中可迭代的值数组
      return Object.values(obj)
    }
    // 同样,我们的精简环节来了
    const duplicateRemovalByReduce = (list,key) => {
      // 一位朋友在vue源码中看到的逗号运算符的应用,虽然比较难理解,但是真帅!
      return Object.values(list.reduce((pre, cur) => (pre[cur[key]] = pre[cur[key]] || cur, pre), {}))
    }
    

    由于我比较懒,复杂数组按条件去重就写这两样了。还有更多的写法,欢迎交流~

    一个值得注意的点

    精简写法虽然代码量少,看起来非常舒服。但是如果不写注释突然在你的某个业务功能函数里来上这么一段,分分钟能气死你的同事和过了很久之后再看代码的自己。所以我有两点建议:

    1. 一个函数只做一件事,去重函数就只用来去重,把去重函数单独抽出来写成独立的函数,而不是混在业务逻辑里。
    2. 多写注释

    感谢阅读,mua~


    起源地下载网 » 快乐Js之数组去重

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元