【问题标题】:Array.pop - last two elements - JavaScriptArray.pop - 最后两个元素 - JavaScript
【发布时间】:2018-03-27 15:47:48
【问题描述】:

我有一个在 JavaScript 中使用 Array.pop 函数的问题。 Array.pop 移除并返回 Array 的最后一个元素。那么我的问题是:是否可以删除并返回数组的最后一个 TWO 元素并返回它们而不是最后一个?

我正在使用这个函数来返回 URL 的最后一个元素,像这样:

网址:www.example.com/products/cream/handcreamproduct1

'url'.splice("/").pop(); -----> "handcreamproduct1"

我想要的是:

'url'.splice("/").pop(); -----> "cream/handcreamproduct1"

我想获取 url 中的最后两个参数并返回它们,使用 .pop 我只得到最后一个。请记住,URL 是动态长度。网址可能如下所示:

网址:www.example.com/products/cream/handcreamproduct1

网址:www.example.com/products/handcream/cream/handcreamproduct1

【问题讨论】:

    标签: javascript arrays url


    【解决方案1】:

    请注意,如果 URL 字符串结尾有 /,那么这里的答案只会返回 URL 的最后一部分:

    var url = 'www.example.com/products/cream/handcreamproduct1/';
    
    var lastTWo = url
      .split("/") // split to an array
      .slice(-2) // take the two last elements
      .join('/') // join back to a string;
    
    console.log(lastTWo);

    要解决此问题,我们只需删除结尾的 /

    const urlRaw = 'www.example.com/products/cream/handcreamproduct1/';
    const url = urlRaw.endsWith("/") ? urlRaw.slice(0, -1) : urlRaw
    const lastTWo = url
      .split("/") // split to an array
      .slice(-2) // take the two last elements
      .join('/') // join back to a string;
    
    console.log(lastTWo);

    【讨论】:

      【解决方案2】:

      您可以使用String.prototype.match()RegExp /[^/]+\/[^/]+$/ 来匹配一个或多个字符,后跟"/",后跟一个或多个字符,后跟字符串结尾

      let url = "https://www.example.com/products/handcream/cream/handcreamproduct1";
      
      let [res] = url.match(/[^/]+\/[^/]+$/);
      
      console.log(res);

      【讨论】:

      • 这会在第一个元素之前返回“/”斜杠。 “/cream/”而不是“cream/”。并且使用 regEx 不是这样做的干净方式,或者这是否比其他方式有好处?
      • @Asim “这会在第一个元素之前返回“/”斜杠。” 查看更新后的帖子,从开头删除 \/RegExp“而使用 regEx 并不是干净的方式” 不确定你的意思?
      • 谢谢,现在可以了:)!好吧,接受的帖子有一种更简洁的阅读代码的方式。正则表达式对于人眼来说并不容易理解。 (我是初学者)。提出这个问题是为了帮助我解决问题,同时也帮助我和其他人了解更多。
      • @Asim 不确定“干净”是什么意思。 “正则表达式对于人眼来说不容易理解。(我是初学者)。这个问题是为了帮助我解决问题,但也帮助我和其他人理解更多。”没有任何努力保证是“容易”
      • "干净" --> "可读"。是的,确实如此,但有多种答案选择总是一件好事。只是一个简单的问题,regEx 与切片和拼接的性能相比如何?
      【解决方案3】:

      没有内置的数组函数可以做到这一点。

      改为使用

      const urlParts = 'url'.split('/');
      return urlParts[urlParts.length - 2] + "/" + urlParts[urlParts.length - 1];
      

      【讨论】:

      • 我认为@Ori 的答案是加入更干净的方式。您几乎在做同样的事情,但不同之处在于您打印出零件,而 .join 是一个内置函数
      • 我进行了快速的性能比较,我的解决方案快了 5 倍。在 Node v7.5.0 中:数组切片:525.144ms 数组索引:103.884ms(对于 10000x)
      • 差别这么大?连那个切片都是内置函数?
      • 是的,我刚才写了一篇关于这个的博客文章。 codeblocq.com/2016/05/… 无论如何,如果性能对您来说不是问题,更具可读性的解决方案可能更具吸引力
      • 我希望您不要在 'url' 作为字符串而不是 url 作为包含带有斜杠的长字符串的变量进行测试。 'url'.split('/') 将返回 ['url']
      【解决方案4】:

      我喜欢 filter 这样的新数组方法,所以有一个 demo 可以使用它

      let o = 'www.example.com/products/cream/handcreamproduct1'.split('/').filter(function(elm, i, arr){
          if(i>arr.length-3){
        return elm;
        }
      });
      console.log(o);
      

      【讨论】:

      • 很好,我看了演示,看起来很有希望。但我需要返回字符串而不是数组。无论如何,谢谢,今天学习了一个新功能:)
      【解决方案5】:

      Split数组,用Array#slice得到最后两个元素,然后Array#join加上斜线:

      var url = 'www.example.com/products/cream/handcreamproduct1';
      
      var lastTWo = url
        .split("/") // split to an array
        .slice(-2) // take the two last elements
        .join('/') // join back to a string;
      
      console.log(lastTWo);

      【讨论】:

      • 像魅力一样工作。谢谢@Ori,感觉切片会是更好的选择。
      • id 像这种简单的方法
      • @Asim - 在这种情况下拼接也可以工作。但是,您需要先拆分:)
      猜你喜欢
      • 2022-06-12
      • 1970-01-01
      • 2020-08-13
      • 2021-12-25
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多