Iterator.prototype.find()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used 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

ブラウザーの互換性

BCD tables only load in the browser

関連情報