Array.prototype.findLast()
åºçº¿
广æ³å¯ç¨
èª 2022å¹´8æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
findLast() æ¹æ³ååè¿ä»£æ°ç»ï¼å¹¶è¿å满足æä¾çæµè¯å½æ°ç第ä¸ä¸ªå
ç´ çå¼ãå¦ææ²¡ææ¾å°å¯¹åºå
ç´ ï¼åè¿å undefinedã
å¦æä½ éè¦æ¥æ¾ï¼
- 第ä¸ä¸ªå¹é
çå
ç´ ï¼è¯·ä½¿ç¨
find()ã - æ°ç»ä¸æåä¸ä¸ªå¹é
å
ç´ çç´¢å¼ï¼è¯·ä½¿ç¨
findLastIndex()ã - æä¸ªå¼çç´¢å¼ï¼è¯·ä½¿ç¨
indexOf()ãï¼å®ç±»ä¼¼äºfindIndex()ï¼ä½æ¯ä¼æ£æ¥æ¯ä¸ªå ç´ æ¯å¦ä¸å¼ç¸çï¼è䏿¯ä½¿ç¨ä¸ä¸ªæµè¯å½æ°ãï¼ - æä¸ªå¼æ¯å¦åå¨è¯¥æ°ç»ä¸ï¼è¯·ä½¿ç¨
includes()ãåæ ·å°ï¼å®ä¼æ£æ¥æ¯ä¸ªå ç´ æ¯å¦ä¸è¯¥å¼ç¸çï¼è䏿¯ä½¿ç¨ä¸ä¸ªæµè¯å½æ°ã - æ¯å¦æä»»æä¸ä¸ªå
ç´ æ»¡è¶³ç»å®çæµè¯å½æ°ï¼è¯·ä½¿ç¨
some()ã
å°è¯ä¸ä¸
const array = [5, 12, 50, 130, 44];
const found = array.findLast((element) => element > 45);
console.log(found);
// ææè¾åºï¼130
è¯æ³
findLast(callbackFn)
findLast(callbackFn, thisArg)
åæ°
callbackFn-
æ°ç»ä¸æµè¯å ç´ ç彿°ãåè°åºè¯¥è¿åä¸ä¸ªçå¼ï¼è¡¨ç¤ºå·²æ¾å°å¹é çå ç´ ï¼å¦åè¿åä¸ä¸ªåå¼ã彿°å¨è¢«è°ç¨æ¶ä¼ä¼ é以ä¸åæ°ï¼
thisArgå¯é-
æ§è¡
callbackFnæ¶ï¼ç¨ä½thisçå¼ã详è§è¿ä»£æ¹æ³ã
è¿åå¼
æ°ç»ä¸æ»¡è¶³æä¾çæµè¯å½æ°ç´¢å¼æé«çå
ç´ ï¼å¦ææ²¡æå
ç´ å¹é
ï¼è¿å undefinedã
æè¿°
findLast() æ¯ä¸ä¸ªè¿ä»£æ¹æ³ãè¯¥æ¹æ³å¯¹æ°ç»æ¯ä¸ä¸ªå
ç´ æéåºï¼ç´¢å¼ä»å¤§å°å°ï¼æ§è¡ callbackFn 彿°ï¼ç´å° callbackFn è¿åä¸ä¸ªçå¼ãç¶å findLast() è¿å该å
ç´ çå¼å¹¶åæ¢éåæ°ç»ã妿 callbackFn 没æè¿åä¸ä¸ªçå¼ï¼å findLast() è¿å undefinedã
callbackFn ä¼è¢«æ°ç»ä¸çæ¯ä¸ªå
ç´ è°ç¨ï¼èä¸ä»
ä»
æ¯é£äºè¢«èµå¼çå
ç´ ã对äºç¨çæ°ç»æ¥è¯´ï¼ç©ºæ§½è¡ä¸ºå undefined ç¸åã
findLast() æ¹æ³æ¯éç¨çãå®åªææ this å¼å
·æ length 屿§åæ´æ°é®ç屿§ã
示ä¾
>æ¥æ¾ä¸å ç´ å±æ§å¹é çæ°ç»ä¸çæåä¸ä¸ªå¯¹è±¡
æ¤ç¤ºä¾å±ç¤ºäºå¦ä½æ ¹æ®æ°ç»å ç´ ç屿§å建æµè¯ã
const inventory = [
{ name: "apples", quantity: 2 },
{ name: "bananas", quantity: 0 },
{ name: "fish", quantity: 1 },
{ name: "cherries", quantity: 5 },
];
// åºå使¶è¿å true
function isNotEnough(item) {
return item.quantity < 2;
}
console.log(inventory.findLast(isNotEnough));
// { name: "fish", quantity: 1 }
使ç¨ç®å¤´å½æ°åè§£æ
åé¢ç示ä¾å¯ä»¥ä½¿ç¨ç®å¤´å½æ°å对象解æéåå¦ä¸ï¼
const inventory = [
{ name: "apples", quantity: 2 },
{ name: "bananas", quantity: 0 },
{ name: "fish", quantity: 1 },
{ name: "cherries", quantity: 5 },
];
const result = inventory.findLast(({ quantity }) => quantity < 2);
console.log(result);
// { name: "fish", quantity: 1 }
æ¥æ¾æ°ç»ä¸çæåä¸ä¸ªç´ æ°
以ä¸ç¤ºä¾æ¥æ¾æ°ç»ä¸çæåä¸ä¸ªç´ æ°å
ç´ ï¼å¦ææ²¡æç´ æ°ï¼åè¿å undefinedï¼ï¼
function isPrime(n) {
if (n < 2) {
return false;
}
if (n % 2 === 0) {
return n === 2;
}
for (let factor = 3; factor * factor <= n; factor += 2) {
if (n % factor === 0) {
return false;
}
}
return true;
}
console.log([4, 6, 8, 12].findLast(isPrime)); // undefinedï¼æ²¡ææ¾å°
console.log([4, 5, 7, 8, 9, 11, 12].findLast(isPrime)); // 11
夿³¨ï¼isPrime() å®ç°ä»
便¼ç¤ºãå¨å®é
åºç¨ä¸ï¼ä¸ºäºé¿å
éå¤è®¡ç®ï¼ä¼ä½¿ç¨å¤§éè®°å¿åçç®æ³ï¼ä¾å¦åæææ¯ç¹å°¼çæ³ã
æ¥æ¾æè¿å®æçä»»å¡
æ¤ç¤ºä¾æ¼ç¤ºäºå¨å¤çææ¶é´æåºçæ°æ®æ¶ findLast() çä¸ä¸ªå®é
åºç¨åºæ¯ãå®ä»å·²æ timestamp æåºçåè¡¨ä¸æ¥æ¾æè¿å®æçä»»å¡ã
const tasks = [
{ name: "æå»ºé¡¹ç®", completed: true, timestamp: 1609459200000 },
{ name: "ç¼åæµè¯", completed: false, timestamp: 1609545600000 },
{ name: "ä¿®å¤ bug #42", completed: true, timestamp: 1609632000000 },
{ name: "é¨ç½²å°é¢åç¯å¢", completed: true, timestamp: 1609718400000 },
{ name: "å®¡æ¥ PR", completed: false, timestamp: 1609804800000 },
];
const lastCompletedTask = tasks.findLast((task) => task.completed);
console.log(lastCompletedTask.name); // é¨ç½²å°é¢åç¯å¢
è¿æ¯å¯¹ååºæ°æ®ä½¿ç¨ find() æ´é«æï¼å 为å®é¿å
äºåå»ºæ°æ°ç»ã
使ç¨åè°å½æ°ç第ä¸ä¸ªåæ°
å¦æä½ éè¦è®¿é®æ°ç»ä¸çå¦ä¸ä¸ªå
ç´ ï¼array åæ°ä¼é常æç¨ï¼å°¤å
¶æ¯å¨æ²¡æç°æçåéå¼ç¨è¯¥æ°ç»æ¶ã以ä¸ç¤ºä¾é¦å
ä½¿ç¨ filter() æåæ£æ°ï¼ç¶åä½¿ç¨ findLast() æ¥æ¾å°äºå
¶ç¸é»å
ç´ çæåä¸ä¸ªå
ç´ ã
const numbers = [3, -1, 1, 4, 1, 5, 9, 2, 6];
const lastTrough = numbers
.filter((num) => num > 0)
.findLast((num, idx, arr) => {
// å¦ææ²¡æ arr åæ°ï¼å°±æ æ³è½»æ¾è®¿é®ä¸é´æ°ç»ï¼é¤éå°å
¶ä¿åå°åéä¸ã
if (idx > 0 && num >= arr[idx - 1]) return false;
if (idx < arr.length - 1 && num >= arr[idx + 1]) return false;
return true;
});
console.log(lastTrough); // 2
å¨ç¨çæ°ç»ä¸ä½¿ç¨ findLast()
ç¨çæ°ç»ä¸ç空槽被访é®ï¼å¹¶è¢«è§ä¸º undefinedã
// 声æä¸ä¸ªå¨ç´¢å¼ 2ã3 å 4 夿²¡æå
ç´ çæ°ç»
const array = [0, 1, , , , 5, 6];
// æ¾ç¤ºææçç´¢å¼ï¼ä¸åªå
æ¬é£äºè¢«èµå¼çï¼
array.findLast((value, index) => {
console.log(`访é®ç´¢å¼ ${index}ï¼å¼ä¸º ${value}`);
return false;
});
// 访é®ç´¢å¼ 6ï¼å¼ä¸º 6
// 访é®ç´¢å¼ 5ï¼å¼ä¸º 5
// 访é®ç´¢å¼ 4ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 3ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 2ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 1ï¼å¼ä¸º 1
// 访é®ç´¢å¼ 0ï¼å¼ä¸º 0
// æ¾ç¤ºææçç´¢å¼ï¼å
æ¬å·²è¢«å é¤çï¼
array.findLast((value, index) => {
// å¨ç¬¬ä¸æ¬¡è¿ä»£æ¶å é¤å¼ä¸º 5 çå
ç´
if (index === 6) {
console.log(`å é¤å¼ä¸º array[5]ï¼å
¶å¼ä¸º ${array[5]}`);
delete array[5];
}
// å
ç´ 5 å¨è¢«å é¤åï¼ä»ä¼è¢«è®¿é®
console.log(`访é®ç´¢å¼ ${index}ï¼å¼ä¸º ${value}`);
return false;
});
// å é¤å¼ä¸º array[5]ï¼å
¶å¼ä¸º 5
// 访é®ç´¢å¼ 6ï¼å¼ä¸º 6
// 访é®ç´¢å¼ 5ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 4ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 3ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 2ï¼å¼ä¸º undefined
// 访é®ç´¢å¼ 1ï¼å¼ä¸º 1
// 访é®ç´¢å¼ 0ï¼å¼ä¸º 0
å¨éæ°ç»å¯¹è±¡ä¸è°ç¨ findLast()
findLast() æ¹æ³è¯»å this ç length 屿§ï¼ç¶åè®¿é®æ¯ä¸ªé®ä¸ºå°äº length çéè´æ´æ°ç屿§ã
const arrayLike = {
length: 3,
0: 2,
1: 7.3,
2: 4,
3: 3, // 被 findLast() 忽ç¥ï¼å 为 length æ¯ 3
};
console.log(
Array.prototype.findLast.call(arrayLike, (x) => Number.isInteger(x)),
); // 4
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.findlast> |
æµè§å¨å ¼å®¹æ§
åè§
core-jsä¸Array.prototype.findLastç polyfillArray.prototype.findLastç es-shims polyfill- ç´¢å¼éåæå
ArrayArray.prototype.find()Array.prototype.findIndex()Array.prototype.findLastIndex()Array.prototype.includes()Array.prototype.filter()Array.prototype.every()Array.prototype.some()TypedArray.prototype.findLast()