最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 极简实现系列——三行代码搞定LRU

    正文概述 掘金(veryCold)   2021-02-01   498

    LRU的概念可能有部分同学会感到陌生,这里我也不过多说明,简单的解释一下:

    如果 不明白,就请打开你手机上的饿了么美团外卖,然后在搜索框中输入麻辣烫并确定,输入框下面就会产生一条历史记录,然后再输入砂锅粥麻辣香锅重复以上步骤。 此时历史记录的排序应该是[麻辣香锅,砂锅粥,麻辣烫], 然后你点击麻辣烫直接搜索,此时历史记录应该变成[麻辣烫,麻辣香锅,砂锅粥]。 这下懂了吧[狗头]

    懂了之后接下来就是代码实现

    简单来说就这几步

    1. 判断要放入队列中的元素是否已经存在
    2. 如果已经存在队列中,则把队列中的那一项删除。
    3. 放在队首
    4. 如果整个队列的长度大于预设长度,则把最后一个移除掉

    根据以上这些步骤,应该可以很容易的写出一个简版吧

    第一版

    let lruArr = []
    const limit = 3 // 最大限制3个
    function put(val){
      let index = lruArr.findIndex(item => item === val) // 步骤1
      if(index !== -1) { // 步骤2
        lruArr.splice(index,1)
      }
      lruArr.unshift(val)  // 步骤3
      lruArr.length > limit && (lruArr.splice(-1,1)) // 步骤4
    }
    
    put('麻辣烫') // ['麻辣烫']
    put('砂锅粥') // ['砂锅粥',' 麻辣烫']
    put('麻辣香锅') // ['麻辣香锅', '砂锅粥',' 麻辣烫']
    put('烧烤') // ['烧烤','麻辣香锅', '砂锅粥']
    put('砂锅粥') // ['砂锅粥','烧烤','麻辣香锅']
    

    很简单吧~

    还可以更简单~~

    仔细观察一下代码, 假如我把步骤3放在第一步,然后不就转变成了数组去重的问题了吗,数组去重可就是个老生常谈的问题了。来,我们改造一下

    第二版

    let lruArr = []
    const limit = 3 // 最大限制3个
    function put(val) {
      lruArr.unshift(val) // 先执行步骤3
      lurArr = [...new Set(lruArr)] // 去重
      lruArr.length > limit && (lruArr.splice(-1,1)) // 步骤4
    }
    

    真·三行实现 哈哈哈~

    改进版

    现在的代码都暴露在全局,有点不好,再使用ES6来优化一下

    class LRU {
      constructor(limit) {
        this.limit = limit
        this.arr = []
      }
    
      put(val){
        this.arr.unshift(val)
        this.arr = [...new Set(this.arr)]
        this.arr.length > this.limit && (this.arr.splice(-1,1))
        console.log(this.arr)
      }
    }
    
    let lru = new LRU(3)
    lru.put('麻辣烫') // ['麻辣烫']
    lru.put('砂锅粥') // ['砂锅粥',' 麻辣烫']
    lru.put('麻辣香锅') // ['麻辣香锅', '砂锅粥',' 麻辣烫']
    lru.put('烧烤') // ['烧烤','麻辣香锅', '砂锅粥']
    lru.put('砂锅粥') // ['砂锅粥','烧烤','麻辣香锅']
    

    完事~


    起源地下载网 » 极简实现系列——三行代码搞定LRU

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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