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 terminiert.
Syntax
take(limit)
Parameter
limit
-
Die Anzahl der Elemente, die vom Anfang der Iteration genommen werden sollen.
Rückgabewert
Ein neues Iterator-Hilfsobjekt. Der zurückgegebene Iterator-Helfer liefert die Elemente im ursprünglichen Iterator einzeln und vervollständigt dann (die next()
-Methode erzeugt { 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-Folge liefert, und gibt dann die ersten drei Terme aus:
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 bequemsten, wenn Sie den Iterator nicht manuell erstellen. Da Iteratoren auch iterierbar sind, können Sie den zurückgegebenen Helfer mit einer for...of
-Schleife iterieren:
for (const n of fibonacci().take(5)) {
console.log(n);
}
// Logs:
// 1
// 1
// 2
// 3
// 5
Da fibonacci()
ein unendlicher Iterator ist, würde die Verwendung einer for
-Schleife ohne irgendeine Logik, die ein frühes Beenden ermöglicht (wie z.B. 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 des take-Zählers
Wenn 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 limit
größer ist als die Gesamtzahl der Elemente, die der Iterator erzeugen kann (wie z.B. Infinity
), hat der zurückgegebene Iterator-Helfer im Wesentlichen dasselbe 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 |
Browser-Kompatibilität
BCD tables only load in the browser