ArrayとTypedArrayで要素を検索する

公開日 タグ付き ECMAScript

先頭から要素を検索する #

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を返します。findfindIndexの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メソッドでは、このユースケースは直接かつエルゴノミクスに解決できます。これらはfindfindIndexの対応物とまったく同じように動作しますが、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

findLastfindLastIndexはサポートします #