获取数组中的最后一项

IT技术 javascript arrays
2021-01-11 16:29:42

到目前为止,这是我的 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",如果,则改为获取倒数第三项。

6个回答

2021 年 7 月 13 日更新

新的at() 方法允许您使用负索引来表示“从最后”。

您可以locArray像这样访问最后一项

if (locArray.at(-1) === 'index.html') {
   // do something
} else {
   // something else
}

更新时,at()Chrome 92+、FireFox 90+、Node 16 和 Deno 1.12+ 支持方法

较旧的答案

if (loc_array[loc_array.length - 1] === 'index.html') {
   // do something
} else {
   // something else
}

如果您的服务器为“index.html”和“inDEX.htML”提供相同的文件,您还可以使用:.toLowerCase()

不过,如果可能,您可能想考虑在服务器端执行此操作:它会更干净,并且适用于没有 JS 的人。

@BadriDerakhshan 的解决方案对于创建的数组是临时的情况很有用。例如。而不是x = string.split('/'); return x[x.length-1],你可以做return x.split('/').pop()
2021-03-17 16:29:42
@BadriDerakhshan 这将不可避免地在返回数组之前从数组中删除最后一个元素,因此如果您只想检查数组的最后一个元素,这不是一个选项。您还必须将其推回以将阵列恢复到以前的状态。
2021-03-27 16:29:42
如果你只需要最后一项,你可以 Array.pop()
2021-03-30 16:29:42
不适用于Safari
2021-04-03 16:29:42
Safari IOS、Chrome IOS 和三星互联网不支持 at() 方法caniuse.com/mdn-javascript_builtins_string_at
2021-04-07 16:29:42

不确定是否有缺点,但这似乎很简洁:

arr.slice(-1)[0] 

或者

arr.slice(-1).pop()

undefined如果数组为空,两者都将返回

使用解构也很好: const [lastItem] = arr.slice(-1)
2021-03-18 16:29:42
@mvmn 我很久以前做过一个基准测试,在单个 2.4ghz 线程上的吞吐量约为每秒一两百万次调用。因此,除非您解决了无论如何都不应该在 JS 中解决的问题,否则它不会引起注意(与 arr[arr.length-1] 相比,iirc 的减速是 50-100 倍)
2021-03-26 16:29:42
@Badrush slice() 使用单个元素的副本创建新数组,并 pop 仅修改该副本。原始阵列保持完好
2021-04-06 16:29:42
@Govan 请看我的评论。你可以称之为每秒过高的次数。如果您需要更多,或随时可用的数组长度,请使用普通数组访问以获得最大性能arr[arr.length-1]
2021-04-07 16:29:42
.pop()删除修改原始数组的最后一个元素。这与简单地检索该值不同。
2021-04-09 16:29:42

使用Array.pop

var lastItem = anArray.pop();

重要提示:这将返回最后一个元素并将 其从数组中删除

特别适用于: filename.split('.').pop()
2021-03-17 16:29:42
它不仅返回最后一个元素,而且将其删除!
2021-04-03 16:29:42

@chaiguy 发布的内容的简短版本:

Array.prototype.last = function() {
    return this[this.length - 1];
}

读取 -1 索引undefined已经返回

编辑:

如今,偏好似乎是使用module并避免接触原型或使用全局命名空间。

export function last(array) {
    return array[array.length - 1];
}
如果实际如何使用它并不明显,这里有一个例子:var lastItem = [3,2,1,5].last();. lastItemIS 5
2021-03-12 16:29:42
对于任何想知道的人来说,这会破坏 Array.forEach()。我仍然同意修改原型并不是最糟糕的事情,但这一点很糟糕。
2021-03-21 16:29:42
Imo 修改 没有这么大的问题Array.prototype,但你应该使用Object.assign(Array.prototype, 'last', { value: function () { … } });. 否则,该属性将是可枚举的。
2021-03-24 16:29:42
这个答案是正确的,也很干净但是(!!!)使用 Javascript 的经验法则是Do NOT modify objects you Do NOT own. 由于许多原因,这很危险,例如 1. 在您的团队中工作的其他开发人员可能会感到困惑,因为此方法不是标准的 2. 库中的任何更新,甚至使用更低或更高的 ECMAScript 版本,都可能很容易丢失!
2021-04-05 16:29:42
@FarzadYousefzadeh有趣的文章,讲述了何时以及如何修改 JS 原生原型。
2021-04-05 16:29:42

两个选项是:

var last = arr[arr.length - 1]

或者

var last = arr.slice(-1)[0]

前者更快,但后者看起来更好

http://jsperf.com/slice-vs-length-1-arr

感谢您提供 jsperf 链接。从性能的角度来看,第二种选择是无稽之谈。
2021-03-18 16:29:42
第一个选项的作用也很明显。第二个没那么多
2021-04-08 16:29:42