findIndex()
method returns the
index
of the first element in the array
that satisfies the provided testing function
. Otherwise, it returns
-1
, indicating that no element passed the test.
另请参阅
find()
method, which returns the
value
of an array element, instead of its index.
arr.findIndex(callback( element[, index[, array]] )[, thisArg])
callback
A function to execute on each value in the array until the function returns
true
, indicating that the satisfying element was found.
It takes three arguments:
element
The current element being processed in the array.
index
可选
The index of the current element being processed in the array.
array
可选
findIndex()
was called upon.
thisArg
可选
this
when executing
callback
.
The index of the first element in the array that passes the test. Otherwise,
-1
.
findIndex()
method executes the
callback
function once for every index in the array until it finds the one where
callback
返回
truthy
值。
If such an element is found,
findIndex()
immediately returns the element's index. If
callback
never returns a truthy value (or the array's
length
is
0
),
findIndex()
返回
-1
.
Edge case alert:
Unlike other array methods such as
Array.some()
,
callback
is run even for indexes with unassigned values.
callback
is invoked with three arguments:
若
thisArg
parameter is passed to
findIndex()
, it will be used as the
this
inside each invocation of the
callback
. If it is not provided, then
undefined
被使用。
The range of elements processed by
findIndex()
is set before the first invocation of
callback
.
callback
will not process the elements appended to the array after the call to
findIndex()
begins. If an existing, unvisited element of the array is changed by
callback
, its value passed to the
callback
will be the value at the time
findIndex()
visits the element's index.
Elements that are deleted are still visited.
// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
if (!Array.prototype.findIndex) {
Object.defineProperty(Array.prototype, 'findIndex', {
value: function(predicate) {
// 1. Let O be ? ToObject(this value).
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
var thisArg = arguments[1];
// 5. Let k be 0.
var k = 0;
// 6. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk).
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
// d. If testResult is true, return k.
var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) {
return k;
}
// e. Increase k by 1.
k++;
}
// 7. Return -1.
return -1;
},
configurable: true,
writable: true
});
}
If you need to support truly obsolete JavaScript engines that do not support
Object.defineProperty
, it is best not to polyfill
Array.prototype
methods at all, as you cannot make them non-enumerable.
The following example returns the index of the first element in the array that is a prime number, or
-1
if there is no prime number.
function isPrime(num) {
for (let i = 2; num > i; i++) {
if (num % i == 0) {
return false;
}
}
return num > 1;
}
console.log([4, 6, 8, 9, 12].findIndex(isPrime)); // -1, not found
console.log([4, 6, 7, 9, 12].findIndex(isPrime)); // 2 (array[2] is 7)
The following example finds the index of a fruit using an arrow function:
const fruits = ["apple", "banana", "cantaloupe", "blueberries", "grapefruit"]; const index = fruits.findIndex(fruit => fruit === "blueberries"); console.log(index); // 3 console.log(fruits[index]); // blueberries
| 规范 |
|---|
|
ECMAScript (ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification. |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
findIndex
|
Chrome 45 | Edge 12 | Firefox 25 | IE No | Opera 32 | Safari 8 | WebView Android 45 | Chrome Android 45 | Firefox Android 4 | Opera Android 32 | Safari iOS 8 | Samsung Internet Android 5.0 |
nodejs
4.0.0
|
完整支持
不支持
用户必须明确启用此特征。
Array
Array.from()
Array.isArray()
Array.of()
Array.prototype.concat()
Array.prototype.copyWithin()
Array.prototype.entries()
Array.prototype.every()
Array.prototype.fill()
Array.prototype.filter()
Array.prototype.find()
Array.prototype.findIndex()
Array.prototype.flat()
Array.prototype.flatMap()
Array.prototype.forEach()
Array.prototype.includes()
Array.prototype.indexOf()
Array.prototype.join()
Array.prototype.keys()
Array.prototype.lastIndexOf()
Array.prototype.map()
Array.prototype.pop()
Array.prototype.push()
Array.prototype.reduce()
Array.prototype.reduceRight()
Array.prototype.reverse()
Array.prototype.shift()
Array.prototype.slice()
Array.prototype.some()
Array.prototype.sort()
Array.prototype.splice()
Array.prototype.toLocaleString()
Array.prototype.toSource()
Array.prototype.toString()
Array.prototype.unshift()
Array.prototype.values()
Array.prototype[@@iterator]()
get Array[@@species]
Function
Object
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.setPrototypeOf()