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”)
正如您在本JSFiddlepop
中看到的那样,它比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]