连续两次使用array.pop()来获取倒数第二个元素

时间:2015-09-19 13:42:47

标签: javascript arrays

var path = document.location.pathName;
example.com/store/order/cats

有时可能是:

example.com/store/order/cats/

注意最后的斜杠。

我喜欢在任何一种情况下都能归还猫的功能。如果没有尾随斜杠,我会去:

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

但如果有斜杠,我需要pop()两次。我试过这个:

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

引发了错误。

因此,由split(' /')产生的数组可以是:

["", "store", "order", "cats", ""] // trailing slash

["", "store", "order", "cats"] // no trailing slash

如何在任何可能的情况下归还猫?

7 个答案:

答案 0 :(得分:1)

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

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

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

正则表达式\/$将匹配字符串中的尾随//需要通过前缀\来逃避。

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

if (path.charAt(path.length - 1) === '/') {
    path = path.substr(0, path.length - 1);
}

答案 1 :(得分:1)

正如其他人所说,你可以尝试删除最后一个字符(如果是斜线),然后使用第一个方法。

function getLastWordInPathName() {
  var path = document.location.pathName.replace(/\/$/, '');
  return path.split('/').pop();
}

但是,您的问题是询问为什么不能两次致电pop()

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

答案 2 :(得分:1)

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

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

    return location.split("/").pop()
}

答案 3 :(得分:1)

Array.pop()返回最后一个元素,而不是原始Array。所以在最后一个元素上调用第二个pop()。如果它没有pop方法,则会出现错误...

要从最终使用path.replace(/.*\/([^\/]+)\/([^\/]+)\/?$/,'$1')

获取第二个路径元素

答案 4 :(得分:1)

正如您在此JSFiddle中所看到的那样http://jsfiddle.net/zarjay/mbggs/ pop 比<{1}}更有效

现在看看这段代码:

RegExp

您第一次看到function( ) { var paths = path.split( "/" ), cats = paths.pop( ); if( !cats ) { cats = paths.pop( ); } return cats; } 路径后,删除了数组的最后一个元素

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

你的表现会好很多,如果你在一个循环中使用这个数千次迭代,你将获得大约几秒钟的性能提升

这很整洁

答案 5 :(得分:1)

确实有很多方法可以给猫皮肤。这些假设您需要一个衬垫而不是更具防御性并且表现良好的东西。

如果你总是想要第二个

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

提取所有非空分隔的项目:

'/a/b//c/d/'.match(/[^\/]+/g)
[a, b, c, d]

答案 6 :(得分:0)

您可以在末尾迭代并丢弃空路径元素:

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

或者您可以使用正则表达式:

function pathTail(path) {
  return path.replace(/^.*\/([^/]+)\/*$/, "$1");
}