Array.prototype.lastIndexOf() - JavaScript 编辑
概述
lastIndexOf()
方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex
处开始。
语法
arr.lastIndexOf(searchElement[, fromIndex])
参数
searchElement
- 被查找的元素。
fromIndex
可选- 从此位置开始逆向查找。默认为数组的长度减 1(
arr.length - 1
),即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。 返回值
数组中该元素最后一次出现的索引,如未找到返回-1。
描述
lastIndexOf
使用严格相等(strict equality,即 ===)比较 searchElement
和数组中的元素。
示例
例子:使用 lastIndexOf
下例使用 lastIndexOf
定位数组中的值。
var array = [2, 5, 9, 2];
var index = array.lastIndexOf(2);
// index is 3
index = array.lastIndexOf(7);
// index is -1
index = array.lastIndexOf(2, 3);
// index is 3
index = array.lastIndexOf(2, 2);
// index is 0
index = array.lastIndexOf(2, -2);
// index is 0
index = array.lastIndexOf(2, -1);
// index is 3
例子:查找所有元素
下例使用 lastIndexOf
查找到一个元素在数组中所有的索引(下标),并使用 push
将所有添加到另一个数组中。
var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.lastIndexOf(element);
while (idx != -1) {
indices.push(idx);
idx = (idx > 0 ? array.lastIndexOf(element, idx - 1) : -1);
}
console.log(indices);
// [4, 2, 0];
注意,我们要单独处理idx==0
时的情况,因为如果是第一个元素,忽略了fromIndex
参数则第一个元素总会被查找。这不同于indexOf
方法
注:原英文是针对使用三元操作符语句的作用进行说明的:idx = (idx > 0 ? array.lastIndexOf(element, idx - 1) : -1);
idx > 0
时,才进入lastIndexOf由后往前移一位进行倒查找;如果idx == 0
则直接设置idx = -1
,循环while (idx != -1)
就结束了。
兼容旧环境(Polyfill)
lastIndexOf
在 ECMA-262 标准第 5 版被添加。因此它在不兼容该标准的浏览器中可能不被支持。你可以把下面代码添加到脚本中来使那些没有实现该方法的实现环境支持该方法。该算法是被 ECMA-262 第 5 版指定的。假定 Object
、TypeError
、Number
、Math.floor
、Math.abs
,以及 Math.min
拥有其初始值。
if (!Array.prototype.lastIndexOf) {
Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {
'use strict';
if (this === void 0 || this === null) {
throw new TypeError();
}
var n, k,
t = Object(this),
len = t.length >>> 0;
if (len === 0) {
return -1;
}
n = len - 1;
if (arguments.length > 1) {
n = Number(arguments[1]);
if (n != n) {
n = 0;
}
else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
}
for (k = n >= 0
? Math.min(n, len - 1)
: len - Math.abs(n); k >= 0; k--) {
if (k in t && t[k] === searchElement) {
return k;
}
}
return -1;
};
}
另外,该实现是为了绝对兼容 Firefox 和 the SpiderMonkey JavaScript 引擎中的 lastIndexOf
,包括了几种临界情况。如果你要在实际应用中使用该实现,可以忽略这些临界情况,从而简化 fromIndex
的计算。
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262) Array.prototype.lastIndexOf | Standard | Initial definition. Implemented in JavaScript 1.6. |
ECMAScript 2015 (6th Edition, ECMA-262) Array.prototype.lastIndexOf | Standard | |
ECMAScript (ECMA-262) Array.prototype.lastIndexOf | Living Standard |
浏览器兼容性
BCD tables only load in the browser
The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.相关链接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论