Array.prototype.findLastIndex()
Baseline 2022
Newly available
Since August 2022, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
findLastIndex()
は Array
のメソッドで、この配列を逆順に反復処理し、指定されたテスト関数を満たす配列の最後の要素のインデックスを返します。
テスト関数を満たす要素がなかった場合は、 -1 を返します。
findLast()
メソッドも参照してください。こちらはテスト関数を満たす最後の要素の(位置ではなく)値を返します。
試してみましょう
構文
findLastIndex(callbackFn)
findLastIndex(callbackFn, thisArg)
引数
返値
配列内で、テストを満たした最後の(最も大きな)要素のインデックス。
それ以外の場合は,一致する要素が見つからなければ -1
となります。
解説
findLastIndex()
メソッドは反復処理メソッドです。配列のそれぞれの要素に対して、インデックスの降順に一度ずつ指定された callbackFn
関数を実行し、 callbackFn
が真値を返すまで続けます。そして、 findLastIndex()
がその要素のインデックスを返し、配列のイテレーターを停止します。もし callbackFn
が真値を返さなかった場合、 findLastIndex()
は -1
を返します。
callbackFn
は値が割り当てられている要素だけではなく、配列の「すべての」インデックスに対して呼び出されます。疎配列で空のスロットは undefined
と同じ動作をします。
findLastIndex()
メソッドは呼び出し元の配列を変更しませんが、 callbackFn
に指定された関数は変更することがあります。ただし、配列の長さは callbackFn
を最初に呼び出す前に保存されることに注意してください。したがって、
callbackFn
はfindLastIndex()
の呼び出しを始めたときの配列の長さを超えて追加された要素にはアクセスしません。- 既に訪問した位置を変更しても、
callbackFn
が再度呼び出されることはありません。 - まだ訪問していない既存の配列要素が
callbackFn
によって変更された場合、callbackFn
に渡される値はその要素が取得される時点の値になります。削除された 要素はundefined
であるかのように処理されます。
警告: 前項で説明したような、参照中の配列の同時進行での変更は(特殊な場合を除いて)普通は避けるべきです。多くの場合、理解しにくいコードになります。
findLastIndex()
メソッドは汎用的です。これは this
値に length
プロパティと整数キーのプロパティがあることだけを期待します。
例
配列内の最後の素数の位置を探す
以下の例では、配列の最後の要素が素数である場合のインデックスを返します。素数が存在しない場合は -1
を返します。
function isPrime(element) {
if (element % 2 === 0 || element < 2) {
return false;
}
for (let factor = 3; factor <= Math.sqrt(element); factor += 2) {
if (element % factor === 0) {
return false;
}
}
return true;
}
console.log([4, 6, 8, 12].findLastIndex(isPrime)); // -1, not found
console.log([4, 5, 7, 8, 9, 11, 12].findLastIndex(isPrime)); // 5
疎配列に対する findLastIndex() の使用
疎配列から undefined
を検索し、空のスロットのインデックスを取得することができます。
console.log([1, , 3].findLastIndex((x) => x === undefined)); // 1
配列でないオブジェクトに対する findLastIndex() の呼び出し
findLastIndex()
メソッドは this
の length
プロパティを読み込み、次にキーが length
より小さい非負の整数である各プロパティにアクセスします。
const arrayLike = {
length: 3,
0: 2,
1: 7.3,
2: 4,
3: 3, // length が 3 であるため findLastIndex() から無視される
};
console.log(
Array.prototype.findLastIndex.call(arrayLike, (x) => Number.isInteger(x)),
); // 2
仕様書
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.findlastindex |
ブラウザーの互換性
BCD tables only load in the browser