Iterator.prototype.take()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Die take() Methode von Iterator Instanzen gibt ein neues Iterator-Hilfsobjekt zurück, das die angegebene Anzahl von Elementen in diesem Iterator liefert und dann beendet.

Syntax

js
take(limit)

Parameter

limit

Die Anzahl der Elemente, die vom Beginn der Iteration an genommen werden sollen.

Rückgabewert

Ein neues Iterator-Hilfsobjekt. Der zurückgegebene Iterator-Helfer liefert die Elemente im ursprünglichen Iterator nacheinander und schließt dann ab (die next() Methode produziert { value: undefined, done: true }), sobald limit Elemente geliefert wurden oder wenn der ursprüngliche Iterator erschöpft ist, je nachdem, was zuerst eintritt.

Ausnahmen

RangeError

Wird ausgelöst, wenn limit zu NaN oder negativ wird, wenn es in eine Ganzzahl umgewandelt wird.

Beispiele

Verwendung von take()

Das folgende Beispiel erstellt einen Iterator, der Terme in der Fibonacci-Sequenz liefert und protokolliert dann die ersten drei Terme:

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

const seq = fibonacci().take(3);
console.log(seq.next().value); // 1
console.log(seq.next().value); // 1
console.log(seq.next().value); // 2
console.log(seq.next().value); // undefined

Verwendung von take() mit einer for...of Schleife

take() ist am praktischsten, wenn Sie den Iterator nicht manuell schreiben. Da Iteratoren auch iterierbar sind, können Sie den zurückgegebenen Helfer mit einer for...of Schleife durchlaufen:

js
for (const n of fibonacci().take(5)) {
  console.log(n);
}

// Logs:
// 1
// 1
// 2
// 3
// 5

Da fibonacci() ein endloser Iterator ist, würde die Verwendung einer for Schleife zum Durchlaufen ohne irgendeine Logik, um frühzeitig zu beenden (wie eine break Anweisung), zu einer Endlosschleife führen.

Kombinieren von drop() mit take()

Sie können take() mit Iterator.prototype.drop() kombinieren, um einen Abschnitt eines Iterators zu erhalten:

js
for (const n of fibonacci().drop(2).take(5)) {
  // Drops the first two elements, then takes the next five
  console.log(n);
}
// Logs:
// 2
// 3
// 5
// 8
// 13

for (const n of fibonacci().take(5).drop(2)) {
  // Takes the first five elements, then drops the first two
  console.log(n);
}
// Logs:
// 2
// 3
// 5

Untere und obere Grenzen der take-Zählung

Wenn das limit negativ oder NaN ist, wird ein RangeError ausgelöst:

js
fibonacci().take(-1); // RangeError: -1 must be positive
fibonacci().take(undefined); // RangeError: undefined must be positive

Wenn das limit größer ist als die Gesamtanzahl der Elemente, die der Iterator erzeugen kann (wie Infinity), hat der zurückgegebene Iterator-Helfer im Wesentlichen das gleiche Verhalten wie der ursprüngliche Iterator:

js
for (const n of new Set([1, 2, 3]).values().take(Infinity)) {
  console.log(n);
}

// Logs:
// 1
// 2
// 3

Spezifikationen

Specification
Iterator Helpers
# sec-iteratorprototype.take

Browser-Kompatibilität

Siehe auch