Array.prototype.findIndex()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´9æ.
findIndex() æ¹æ³å°ä¾ææä¾ç測試å½å¼ï¼å°æ¾é£åä¸ç¬¦åçå
ç´ ï¼ä¸¦è¿åå
¶ indexï¼ç´¢å¼ï¼ãå¦ææ²æç¬¦åçå°è±¡ï¼å°è¿å -1 ã
å試ä¸ä¸
const array1 = [5, 12, 8, 130, 44];
const isLargeNumber = (element) => element > 13;
console.log(array1.findIndex(isLargeNumber));
// Expected output: 3
å¦è«åè¦ find() æ¹æ³ï¼å®è¿åé£å䏿¾å°çå
ç´ çå¼ï¼è䏿¯å
¶ç´¢å¼ã
èªæ³
arr.findIndex(callback[, thisArg])
忏
callback-
éå°é£åä¸çæ¯åå ç´ ï¼é½æå·è¡è©²åå¼å½å¼ï¼å·è¡ææèªåå³å ¥ä¸é¢ä¸å忏ï¼
element-
ç¶åå ç´ ã
index鏿æ§-
ç¶åå ç´ çç´¢å¼ã
array鏿æ§-
å¼å«
findIndexçé£åã
thisArg鏿æ§-
å¯é¸çãå·è¡ callback æä½çº this å°è±¡çå¼ã
åå³å¼
An index in the array if an element passes the test; otherwise, -1.
æè¿°
findIndex æ¹æ³å°é£åä¸çæ¯ä¸åç´¢å¼ï¼0..length-1ï¼å«ï¼çå
ç´ å·è¡ä¸æ¬¡ callback ç´å°æä¸å callback è¿å truthy å¼ï¼ä¸åå¯å¼·å¶è½åï¼coercesï¼çº true çå¼ï¼ã妿æ¾å°äºä¸å鿍£çå
ç´ ï¼å findIndex å°æç«å»è¿åæ¤æ¬¡è¿ä»£çç´¢å¼ãè¥åå¼å½å¼å¾æªåå³ä¸å truthy å¼ï¼æé£åç length çº 0ï¼å findIndex å°æè¿å -1ãä¸åå
¶ä»çé£åæ¹æ³å¦ some 飿¨£ï¼æ¼ç¨çï¼sparseï¼é£åä¸ callback ä»æè¢«å¼å«ï¼å³ä½¿è©²ç´¢å¼çé
ç®å¨é£åä¸ä¸¦ä¸åå¨ã
callback 被å¼å«ææå³å
¥ä¸å忏ï¼å
ç´ çå¼ãå
ç´ çç´¢å¼ï¼ä»¥å被è¿ä»£çé£åç©ä»¶ã
妿ä¸å thisArg åæ¸è¢«æä¾çµ¦ findIndexï¼å®å°æè¢«ç¶ä½ this 使ç¨å¨æ¯æ¬¡åå¼å½å¼è¢«èª¿ç¨çæåãå¦ææ²æè¢«æä¾ï¼å°æä½¿ç¨ undefinedã
findIndex ä¸æä¿®æ¹å¼å«æ¤æ¹æ³çé£åã
å¨ç¬¬ä¸æ¬¡å¼å« callback å½å¼ææç¢ºå®å
ç´ çç´¢å¼ç¯åï¼å æ¤å¨ findIndex æ¹æ³éå§å·è¡ä¹å¾æ·»å å°é£åçæ°å
ç´ å°ä¸æè¢« callback å½å¼è¨ªåå°ã妿é£åä¸ä¸åå°æªè¢« callback å½å¼è¨ªåå°çå
ç´ çå¼è¢« callback å½å¼ææ¹è®ï¼é£éº¼ç¶ callback å½å¼è¨ªåå°å®æï¼å®ç弿¯å°æ¯æ ¹æå®å¨é£åä¸çç´¢å¼æè¨ªåå°çç¶åå¼ï¼è¢«åªé¤çå
ç´ ä»ç¶æè¢«è¨ªåå°ã
ç¯ä¾
>å°æ¾é£åä¸é¦å質æ¸å ç´ çç´¢å¼
以ä¸çç¯ä¾æ¼ç¤ºäºå¦ä½æ¥æ¾ä¸åé£åä¸é¦å質æ¸å ç´ çç´¢å¼ï¼æ¾ä¸å°åè¿å -1ã
function isPrime(element, index, array) {
var start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) {
return false;
}
}
return element > 1;
}
console.log([4, 6, 8, 12].findIndex(isPrime)); // -1, not found
console.log([4, 6, 7, 12].findIndex(isPrime)); // 2
使ç¨ç®é å½å¼å°æ¾ç´¢å¼
以ä¸ç¯ä¾çºä½¿ç¨ç®é å½å¼å°æ¾æ°´æçç´¢å¼ã
const fruits = ["apple", "banana", "cantaloupe", "blueberries", "grapefruit"];
const index = fruits.findIndex((fruit) => fruit === "blueberries");
console.log(index); // 3
console.log(fruits[index]); // blueberries
Polyfill
// 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;
},
});
}
å¦æä½ éè¦ç¸å®¹éæç䏿¯æ´ Object.defineProperty ç JavaScript å¼æï¼æå¥½ä¸è¦ä½¿ç¨ polyfill ä¾å¡«å
Array.prototype æ¹æ³ï¼å çºç¡æ³ä½¿å®åæçºä¸å¯æèçï¼non-enumerableï¼å±¬æ§ã
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.findindex> |