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
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
zuNaN
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:
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:
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:
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:
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:
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 |