先頭から要素を検索する #
Array
にある条件を満たす要素を検索することは一般的なタスクであり、Array.prototype
とさまざまなTypedArrayプロトタイプにあるfind
メソッドとfindIndex
メソッドで行われます。Array.prototype.find
は述語を取り、述語がtrue
を返す配列の最初の要素を返します。述語がどの要素に対してもtrue
を返さない場合、メソッドはundefined
を返します。
const inputArray = [{v:1}, {v:2}, {v:3}, {v:4}, {v:5}];
inputArray.find((element) => element.v % 2 === 0);
// → {v:2}
inputArray.find((element) => element.v % 7 === 0);
// → undefined
Array.prototype.findIndex
は同じく動作しますが、見つかった場合はインデックスを返し、見つからない場合は-1
を返します。find
とfindIndex
のTypedArrayバージョンはまったく同様に動作しますが、唯一の違いは配列インスタンスではなくTypedArrayインスタンスで動作する点です。
inputArray.findIndex((element) => element.v % 2 === 0);
// → 1
inputArray.findIndex((element) => element.v % 7 === 0);
// → -1
末尾から要素を検索する #
Array
の最後の要素を検索したい場合はどうでしょうか?このユースケースは、最後の要素を優先して複数の一致を重複解除したり、要素がおそらくArray
の末尾付近にあることを事前にわかっている場合など、自然に発生することがよくあります。find
メソッドでは、最初の解決策として入力を逆にすることが挙げられます。
inputArray.reverse().find(predicate)
ただし、元のinputArray
がインプレースで逆になるので、これは望まれない場合があります。
findLast
メソッドとfindLastIndex
メソッドでは、このユースケースは直接かつエルゴノミクスに解決できます。これらはfind
とfindIndex
の対応物とまったく同じように動作しますが、Array
またはTypedArrayの末尾から検索を開始します。
const inputArray = [{v:1}, {v:2}, {v:3}, {v:4}, {v:5}];
inputArray.findLast((element) => element.v % 2 === 0);
// → {v:4}
inputArray.findLast((element) => element.v % 7 === 0);
// → undefined
inputArray.findLastIndex((element) => element.v % 2 === 0);
// → 3
inputArray.findLastIndex((element) => element.v % 7 === 0);
// → -1
findLast
とfindLastIndex
はサポートします #
- Chrome: バージョン97以降でサポート
- Firefox: サポートなし
- Safari: 部分的にサポート
- Node.js: サポートなし
- Babel: サポート