Javascript 在一行中使用array.pop()两次以获取最后一个元素

Javascript 在一行中使用array.pop()两次以获取最后一个元素,javascript,arrays,Javascript,Arrays,有时可能是: var path = document.location.pathName; example.com/store/order/cats 注意末尾的斜线 我想要一个函数返回猫在任何情况下。如果没有尾随斜杠,我会: example.com/store/order/cats/ 但是如果后面有斜杠,我需要pop()两次。我试过这个: function() { return path.split('/').pop(); } 它抛出了一个错误 因此,由拆分(“/”产生的数组可以是

有时可能是:

var path = document.location.pathName;
example.com/store/order/cats
注意末尾的斜线

我想要一个函数返回猫在任何情况下。如果没有尾随斜杠,我会:

example.com/store/order/cats/
但是如果后面有斜杠,我需要
pop()
两次。我试过这个:

function() {
    return path.split('/').pop();
}
它抛出了一个错误

因此,由拆分(“/”产生的数组可以是:

function() {
        return path.split('/').pop().pop();
    }


在这两种情况下,我如何返回cat?

您只需迭代并在最后丢弃空路径元素即可:

["", "store", "order", "cats"] // no trailing slash
也可以使用正则表达式:

function pathTail(path) {
  for (var split = path.split("/"), tail = split.pop(); !tail; tail = split.pop());
  return tail;
}

您可以先从字符串中删除最后一个尾随的
/
,然后对结果字符串使用
pop

function pathTail(path) {
  return path.replace(/^.*\/([^/]+)\/*$/, "$1");
} 
正则表达式
\/$
将匹配字符串的尾部
/
/
需要通过前面的
\
进行转义

您还可以使用以下字符串方法:

var path = document.location.pathName.replace(/\/$/, '');

var pathName = path.split('/').pop();

正如其他人所说,如果最后一个字符是斜杠,您可以尝试删除它,然后使用第一种方法

if (path.charAt(path.length - 1) === '/') {
    path = path.substr(0, path.length - 1);
}
但是,您的问题是为什么不能调用
pop()
两次


第一次调用
pop()
,将返回数组中最后一个元素的值。当您再次调用
pop()
时,此函数将应用于上一个函数的结果-因此您正在对字符串
'/'
而不是数组调用
pop()

这是迄今为止最简单的方法:

function getLastWordInPathName() {
  var path = document.location.pathName.replace(/\/$/, '');
  return path.split('/').pop();
}
返回最后一个元素,而不是原始数组。因此,在最后一个元素上调用第二个pop()。如果它没有pop方法,则会出现错误


要从终端获取第二个path元素,请使用
path.replace(/.\/([^\/]+)\/([^\/]+)\/?$/,“$1”)
正如您在本JSFiddle
pop
中看到的那样,它比
RegExp
更高效

现在看一下这段代码:

// Couldn't resist :)
function getCats( location ) {
    if ( location.charAt( location.length-1 ) == "/" ) {
        location = location.slice(0, -1)
    }

    return location.split("/").pop()
}
您第一次看到
pop
路径后,删除了数组的最后一个元素

现在,如果您发现该元素为空,只需再次
pop
,即可获得所需的元素

您的性能将大大提高,如果您在数千次迭代的循环中使用此功能,您将在几秒钟内获得性能提升


这很好

给猫剥皮的方法确实很多。这些假设你想要的是一句台词,而不是更具防御性的东西,而且表现良好

如果你总是想要最后一个的第二个

function( ) {
  var paths = path.split( "/" ),
      cats = paths.pop( );

  if( !cats ) {
    cats = paths.pop( );
  }

  return cats;
}
这可能会稍微好一点:

[1,2,3,4,5].slice(-2).shift()
4
要提取所有非空分隔项,请执行以下操作:

[1,2,3,4,5].slice(-2, -1)[0]
4

谢谢你的回答。只是想了解这里的正则表达式。替换(/\/$/,“”),这样它将匹配尾部斜杠(如果有),但是如果没有尾部斜杠,它会做什么?它不会去掉猫身上的“s”吗?(我进行了测试,结果似乎没有出现这种情况,所以这很好。但是正则表达式是如何做到这一点的呢?)我想我现在明白了。Replace仅在找到匹配项/$时替换。再次感谢@DougFirr不,它只会删除尾随斜杠,如果没有尾随斜杠,它不会做任何事情
[1,2,3,4,5].slice(-2, -1)[0]
4
'/a/b//c/d/'.match(/[^\/]+/g)
[a, b, c, d]