Iterator.prototype.flatMap()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Die flatMap()
Methode von Iterator
Instanzen gibt ein neues Iterator-Hilfsobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Abbildungsfunktion ausführt und die von der Abbildungsfunktion zurückgegebenen Elemente liefert (die in einem anderen Iterator oder Iterable enthalten sind).
Syntax
flatMap(callbackFn)
Parameter
callbackFn
-
Eine Funktion, die für jedes Element, das vom Iterator erzeugt wird, ausgeführt wird. Sie sollte einen Iterator oder ein Iterable zurückgeben, das die Elemente liefert, die von
flatMap()
geliefert werden sollen. Beachten Sie, dass im Gegensatz zuArray.prototype.flatMap()
keine einzelnen Nicht-Iterator/Iterable-Werte zurückgegeben werden können. Die Funktion wird mit den folgenden Argumenten aufgerufen:
Rückgabewert
Ein neues Iterator-Hilfsobjekt. Wenn die next()
-Methode des Iterator-Hilfsobjekts das erste Mal aufgerufen wird, ruft sie callbackFn
auf das erste von dem zugrunde liegenden Iterator produzierte Element auf, und der Rückgabewert, der ein Iterator oder Iterable sein sollte, wird von dem Iterator-Hilfsobjekt nacheinander geliefert (wie yield*
). Das nächste Element wird vom zugrunde liegenden Iterator geholt, wenn das vorherige von callbackFn
zurückgegebene Element abgeschlossen ist. Wenn der zugrunde liegende Iterator abgeschlossen ist, wird auch das Iterator-Hilfsobjekt abgeschlossen (die next()
-Methode erzeugt { value: undefined, done: true }
).
Ausnahmen
TypeError
-
Wird ausgelöst, wenn
callbackFn
einen Nicht-Iterator/Iterable-Wert oder ein String-Primitive zurückgibt.
Beschreibung
flatMap
akzeptiert zwei Arten von Rückgabewerten von callbackFn
: einen Iterator oder ein Iterable. Sie werden auf die gleiche Weise wie bei Iterator.from()
behandelt: Wenn der Rückgabewert Iterable ist, wird die [Symbol.iterator]()
Methode aufgerufen und der Rückgabewert verwendet; andernfalls wird der Rückgabewert als Iterator behandelt und seine next()
-Methode aufgerufen.
[1, 2, 3]
.values()
.flatMap((x) => {
let itDone = false;
const it = {
next() {
if (itDone) {
return { value: undefined, done: true };
}
itDone = true;
return { value: x, done: false };
},
};
switch (x) {
case 1:
// An iterable that's not an iterator
return { [Symbol.iterator]: () => it };
case 2:
// An iterator that's not an iterable
return it;
case 3:
// An iterable iterator is treated as an iterable
return {
...it,
[Symbol.iterator]() {
console.log("Symbol.iterator called");
return it;
},
};
}
})
.toArray();
// Logs "Symbol.iterator called"
// Returns [1, 2, 3]
Beispiele
Zusammenführen von Maps
Das folgende Beispiel vereint zwei Map
Objekte zu einem:
const map1 = new Map([
["a", 1],
["b", 2],
["c", 3],
]);
const map2 = new Map([
["d", 4],
["e", 5],
["f", 6],
]);
const merged = new Map([map1, map2].values().flatMap((x) => x));
console.log(merged.get("a")); // 1
console.log(merged.get("e")); // 5
Dies vermeidet das Erstellen temporärer Kopien des Inhalts der Map. Beachten Sie, dass das Array [map1, map2]
zunächst in einen Iterator konvertiert werden muss (mithilfe von Array.prototype.values()
), da Array.prototype.flatMap()
nur Arrays, nicht aber Iterables abflacht.
new Map([map1, map2].flatMap((x) => x)); // Map(1) {undefined => undefined}
Zurückgeben von Strings
Strings sind Iterable, aber flatMap()
lehnt speziell String-Primitives, die von callbackFn
zurückgegeben werden, ab, da das Verhalten des Iterierens nach Codepunkten oft nicht das ist, was man möchte.
[1, 2, 3]
.values()
.flatMap((x) => String(x))
.toArray(); // TypeError: Iterator.prototype.flatMap called on non-object
Man könnte es stattdessen in ein Array einwickeln, damit der gesamte String als ein Element geliefert wird:
[1, 2, 3]
.values()
.flatMap((x) => [String(x)])
.toArray(); // ['1', '2', '3']
Oder, wenn das Verhalten des Iterierens nach Codepunkten beabsichtigt ist, können Sie Iterator.from()
verwenden, um es in einen richtigen Iterator zu konvertieren:
[1, 2, 3]
.values()
.flatMap((x) => Iterator.from(String(x * 10)))
.toArray();
// ['1', '0', '2', '0', '3', '0']
Spezifikationen
Specification |
---|
Iterator Helpers # sec-iteratorprototype.flatmap |