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 einen neuen Iterator-Helfer zurück, der jedes Element im ursprünglichen Iterator nimmt, es durch eine Mapping-Funktion laufen lässt und Elemente zurückgibt, die von der Mapping-Funktion zurückgegeben werden (die in einem anderen Iterator oder Iterablen enthalten sind).
Syntax
flatMap(callbackFn)
Parameter
callbackFn
-
Eine Funktion, die für jedes vom Iterator erzeugte Element ausgeführt wird. Sie sollte einen Iterator oder Iterable zurückgeben, der 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 neuer Iterator-Helfer. Wenn die next()
-Methode des Iterator-Helfers das erste Mal aufgerufen wird, ruft sie callbackFn
für das erste vom zugrunde liegenden Iterator erzeugte Element auf, und der Rückgabewert, der ein Iterator oder Iterable sein sollte, wird einzeln vom Iterator-Helfer geliefert (wie yield*
). Das nächste Element wird vom zugrunde liegenden Iterator abgerufen, wenn das vorherige von callbackFn
zurückgegebene Element abgeschlossen ist. Wenn der zugrunde liegende Iterator abgeschlossen ist, wird auch der Iterator-Helfer abgeschlossen (die next()
-Methode liefert { value: undefined, done: true }
).
Ausnahmen
TypeError
-
Wird ausgelöst, wenn
callbackFn
einen nicht-Iterator/Iterable-Wert oder eine String-Primitiv zurückgibt.
Beschreibung
flatMap
akzeptiert zwei Arten von Rückgabewerten von callbackFn
: einen Iterator oder Iterable. Sie werden auf die gleiche Weise wie Iterator.from()
behandelt: wenn der Rückgabewert iterable ist, wird die Methode [Symbol.iterator]()
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
Im folgenden Beispiel werden zwei Map
-Objekte zu einem zusammengeführt:
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 die Erstellung temporärer Kopien des Inhalts der Map. Beachten Sie, dass das Array [map1, map2]
zuerst in einen Iterator umgewandelt werden muss (mithilfe von Array.prototype.values()
), da Array.prototype.flatMap()
nur Arrays und nicht Iterables abflacht.
new Map([map1, map2].flatMap((x) => x)); // Map(1) {undefined => undefined}
Rückgabe von Strings
Strings sind iterierbar, aber flatMap()
lehnt speziell String-Primitiven ab, die von callbackFn
zurückgegeben werden, da das Verhalten des Iterierens über Codepunkte oft nicht das gewünschte ist.
[1, 2, 3]
.values()
.flatMap((x) => String(x))
.toArray(); // TypeError: Iterator.prototype.flatMap called on non-object
Möglicherweise möchten Sie es stattdessen in ein Array einwickeln, sodass der gesamte String als eines geliefert wird:
[1, 2, 3]
.values()
.flatMap((x) => [String(x)])
.toArray(); // ['1', '2', '3']
Oder, wenn das Verhalten des Iterierens über Codepunkte beabsichtigt ist, können Sie Iterator.from()
verwenden, um ihn in einen ordentlichen 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 |
Browser-Kompatibilität
BCD tables only load in the browser