Iterator.prototype.find()

Baseline 2025
Newly available

Since March 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

find()Iterator インスタンスのメソッドで、 Array.prototype.find() に似ています。イテレーターが生成する要素のうち、指定された試験関数を満たす最初のものを返します。試験関数を満たす値がない場合は、 undefined を返します。

構文

js
find(callbackFn)

引数

callbackFn

このイテレーターが生成するすべての要素に対して実行する関数です。真値を返すと、一致する要素が見つかったことを示し、偽値はそ腕はないことを示します。この関数は、以下の引数とともに呼び出されます。

element

処理中の現在の要素です。

index

処理中の現在の要素のインデックスです。

返値

イテレーターが生成する要素のうち、指定された試験関数を満たす最初のものです。試験関数を満たす値がない場合は、 undefined を返します。

解説

find() はイテレーターを反復処理し、各要素に対して一度ずつ callbackFn 関数を呼び出します。 コールバック関数が真値を返した場合、その要素をただちに返します。 そうでない場合は、イテレーターの終わりまで反復処理を続け、undefined を返します。 find() が要素を返した場合、その元となるイテレーターは return() メソッドを呼んで閉じられます。

イテレーターヘルパーの主な利点は、配列メソッドよりも「遅延的」であるということです。つまり、要求されたときにのみ次の値を生成するという意味です。これにより、不必要なコンピューター処理を避けることができ、また、無限イテレーターでも使用することができます。無限イテレーターでは、 find() は最初の該当要素が見つかった時点でそれを返します。 callbackFn が常に偽値を返す場合、このメソッドは終了しません。

find() の使用

js
function* fibonacci() {
  let current = 1;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

const isEven = (x) => x % 2 === 0;
console.log(fibonacci().find(isEven)); // 2

const isNegative = (x) => x < 0;
console.log(fibonacci().take(10).find(isNegative)); // undefined
console.log(fibonacci().find(isNegative)); // Never completes

find() を呼び出すと、メソッドが途中で返った場合でも、常にその元となるイテレーターが閉じられます。イテレーターが未完了の状態で残されることはありません。

js
const seq = fibonacci();
console.log(seq.find(isEven)); // 2
console.log(seq.next()); // { value: undefined, done: true }

仕様書

Specification
Iterator Helpers
# sec-iteratorprototype.find

ブラウザーの互換性

関連情報