这是我到目前为止的JavaScript代码:
var linkElement = document.getElementById("BackButton");
var loc_array = document.location.href.split('/');
var newT = document.createTextNode(unescape(capWords(loc_array[loc_array.length-2])));
linkElement.appendChild(newT);
目前,它从URL中获取数组中倒数第二个项目 . 但是,我想检查数组中的最后一项是“index.html”,如果是,请 grab 第三项到最后一项 .
30 回答
还有一个npm模块,将
last
添加到Array.prototype
用法
您可以将
last()
函数添加到Array
原型中 .对于那些不怕重载数组原型的人(以及enumeration masking,你不应该这样):
使用lodash _.last(array)获取数组的最后一个元素 .
如果您的服务器为"index.html"和"inDEX.htML"提供相同的文件,您也可以使用:
.toLowerCase()
.但是,如果可能的话,你可能想考虑做这个服务器端:它会更干净,适用于没有JS的人 .
“最干净”的ES6方式(IMO)将是:
如果我们没有使用扩展运算符,这可以避免像
.pop()
那样改变foo
.那就是说,我也喜欢
foo.slice(-1)[0]
解决方案 .就个人而言,我会通过kuporific / kritzikratzi来回答 . 如果你正在使用嵌套数组,那么array [array.length-1]方法会非常难看 .
从性能的角度来看,这是最好的选择(比arr.slice(-1)快〜1000倍) .
您可以将新的property getter添加到prototype of Array,以便可以通过
Array
的所有实例访问它 .Getters允许您访问函数的返回值,就像它是属性的值一样 . 函数的返回值当然是数组的最后一个值(
this[this.length - 1]
) .最后,将其包装在检查
last
-property是否仍为undefined
的条件中(未由可能依赖它的另一个脚本定义) .Does not work in IE ≤ 8.
你可以使用这种模式......
虽然它读起来相当不错,但请记住它会创建一个新数组,因此它几乎永远不会成为应用程序的性能瓶颈 .
两个选项是:
要么
前者更快,但后者看起来更好
http://jsperf.com/slice-vs-length-1-arr
我想如果你只想获得没有删除的元素,更简单的是使用这个:
顺便说一下......我没有检查性能,但我觉得写起来更简单干净
使用Array.pop:
Important :这将返回最后一个元素,并从数组中返回 removes
@chaiguy发布的简短版本:
读取-1索引已经返回
undefined
.EDIT:
目前,偏好似乎是使用模块并避免触及原型或使用全局命名空间 .
In ECMAScript proposal Stage 1建议添加一个将返回最后一个元素的数组属性:proposal-array-last .
句法:
你可以使用polyfill .
提案作者:Keith Cirkel(chai autor)
使用ES6 / ES2015扩展运算符(...),您可以采用以下方式 .
请注意,使用扩展运算符和反向我们没有改变原始数组,这是获取数组的最后一个元素的纯粹方法 .
我建议创建辅助函数并每次重用它,你需要它 . 让我们的功能更加通用,不仅可以获得最后一项,还可以获得最后一项,以此类推 .
用法很简单
现在,让我们解决原始问题
下一行完成了这项工作
所以,你需要重写
通过这种方式
或使用其他变量来提高可读性
不确定是否有缺点,但这似乎很简洁:
要么
如果数组为空,则两者都将返回
undefined
.如果想要一次性获得最后一个元素,他/她可以使用Array#splice():
这里,不需要将split元素存储在数组中,然后到达最后一个元素 . 如果获得最后一个元素是唯一的目标,那么应该使用它 .
注意: This changes the original array 删除其最后一个元素 . 将
splice(-1,1)
视为弹出最后一个元素的pop()
函数 .您也可以在不从URL中提取数组的情况下实现此问题
这是我的选择
!问候
jQuery整齐地解决了这个问题:
这是干净和有效的:
如果使用Babel安装管道运算符,它将变为:
我宁愿使用
array.pop()
而不是索引 .通过这种方式,您始终可以获得index.html之前的元素(假设您的数组已将孤立的index.html作为一个项目) . Note: 但是你将丢失数组中的最后一个元素 .
我通常使用underscorejs,你可以这样做
对我来说更多语义比
loc_array.slice(-1)[0]
我认为最简单,效率最低的方法是:
通过使用带负值的 slice 方法可以获得数组的最后一项 .
您可以在底部阅读更多相关信息here .
使用pop()会改变你的数组,这并不总是一个好主意 .
另一个
ES6
唯一的选择是使用Array.find(item, index)=> {...})
,如下所示:实用 Value 很小,贴出来显示索引也可用于您的过滤逻辑 .
EDITED:
最近我想出了一个我现在认为最符合我需求的解决方案:
有了上面的定义,我现在可以说:
名称 "w" 代表"wrapper" . 您可以看到如何在此包装器之外轻松添加除'last()'之外的更多方法 .
我说“最适合我的需求”,因为这允许我轻松地将任何其他类似的“辅助方法”添加到任何JavaScript内置类型 . 我想到的是Lisp的car()和cdr() .
以下是如何获得它对原始ARRAY没有影响
如果你使用pop(),它将 modify your array
但你可以使用它,所以它在原始数组上有 no effect :
这个问题已经存在了很长时间,所以我很惊讶没有人提到在
pop()
之后将最后一个元素重新打开 .arr.pop()
与arr[arr.length-1]
完全一样有效,并且两者的速度与arr.push()
相同 .因此,你可以逃脱:
这可以减少到这个(相同的速度):
这是
arr[arr.length-1]
的两倍慢,但你在任何一天都不值得 .在我尝试过的解决方案中,以及
arr[arr.length-1]
的执行时间单位(ETU)的倍数:[方法] .............. [ETU 5 elems] ... [ETU 100万elems]
最后三个选项,ESPECIALLY
[...arr].pop()
,随着阵列大小的增加而变得非常糟糕 . 在没有我的机器内存限制的机器上,[...arr].pop()
可能保持类似120:1的比例 . 不过,没有人喜欢资源匮乏 .