Gibt es eine einfache Möglichkeit, ES6-Karten zusammenzuführen (wie Object.assign
)? Und wenn wir schon dabei sind, was ist mit ES6-Sets (wie Array.concat
)?
javascript
set
ecmascript-6
jameslk
quelle
quelle
for..of
weilkey
jeder Typ sein kannAntworten:
Für Sets:
Für Karten:
Beachten Sie, dass der Wert der zusammengeführten Karte der Wert der zuletzt zusammengeführten Karte mit diesem Schlüssel ist, wenn mehrere Karten denselben Schlüssel haben.
quelle
Map
: „Konstruktor:new Map([iterable])
“, „iterable
ist ein Array oder ein anderes iterierbares Objekt, dessen Elemente Schlüssel-Wert-Paare sind (2-Element-Arrays). Jedes Schlüssel-Wert-Paar wird der neuen Karte hinzugefügt. “ - Nur als Referenz.Map
Konstruktor wird dessen Speicherverbrauch vermieden.Hier ist meine Lösung mit Generatoren:
Für Karten:
Für Sets:
quelle
m2.forEach((k,v)=>m1.set(k,v))
wenn du einfache browser unterstützungAus Gründen, die ich nicht verstehe, können Sie den Inhalt eines Sets nicht direkt mit einer integrierten Operation zu einem anderen hinzufügen. Operationen wie Vereinigung, Überschneiden, Zusammenführen usw. sind ziemlich einfache Mengenoperationen, aber nicht integriert. Glücklicherweise können Sie diese alle ziemlich einfach selbst konstruieren.
Um einen Zusammenführungsvorgang zu implementieren (Zusammenführen des Inhalts eines Sets in einem anderen oder einer Map in einem anderen), können Sie dies mit einer einzelnen
.forEach()
Zeile tun :Und zum einen
Map
könnten Sie dies tun:Oder in der ES6-Syntax:
Zu Ihrer Information, wenn Sie eine einfache Unterklasse des integrierten
Set
Objekts möchten , das eine.merge()
Methode enthält , können Sie Folgendes verwenden:Dies soll in der eigenen Datei setex.js sein, die Sie dann
require()
in node.js einfügen und anstelle des integrierten Sets verwenden können.quelle
new Set(s, t)
. funktioniert. Dert
Parameter wird ignoriert. Es ist auch offensichtlich kein vernünftiges Verhalten,add
den Typ seines Parameters zu erkennen und wenn eine Menge die Elemente der Menge hinzufügt, da es dann keine Möglichkeit gibt, eine Menge selbst zu einer Menge hinzuzufügen..add()
Methode betrifft, mit der ein Set erstellt wird, verstehe ich Ihren Standpunkt. Ich finde nur, dass dies weitaus weniger nützlich ist, als Sets kombinieren zu können,.add()
da ich noch nie ein Set oder Sets benötigt habe, aber ich musste Sets oft zusammenführen. Nur eine Frage der Meinung über die Nützlichkeit eines Verhaltens gegenüber dem anderen.n.forEach(m.add, m)
- Es invertiert Schlüssel / Wert-Paare!Map.prototype.forEach()
undMap.prototype.set()
Argumente umgekehrt haben. Scheint wie ein Versehen von jemandem. Es erzwingt mehr Code, wenn versucht wird, sie zusammen zu verwenden.set
Die Parameterreihenfolge ist für Schlüssel / Wert-Paare natürlich undforEach
richtet sich nach der MethodeArray
sforEach
(und nach Dingen wie$.each
oder_.each
die auch Objekte aufzählen).Ursprüngliche Antwort
Ich möchte einen anderen Ansatz vorschlagen, der
reduce
und denspread
Operator verwendet:Implementierung
Verwendung:
Trinkgeld:
Wir können auch den
rest
Operator verwenden, um die Oberfläche ein bisschen schöner zu machen:Anstatt ein Array von Mengen zu übergeben, können wir jetzt eine beliebige Anzahl von Argumenten von Mengen übergeben:
quelle
forof
und zu suchenadd
, was einfach sehr ineffizient zu sein scheint. Ich wünsche mir wirklich eineaddAll(iterable)
Methode für Setsfunction union<T> (...iterables: Array<Set<T>>): Set<T> { const set = new Set<T>(); iterables.forEach(iterable => { iterable.forEach(item => set.add(item)) }) return set }
Die genehmigte Antwort ist großartig, aber das schafft jedes Mal ein neues Set.
Wenn Sie stattdessen ein vorhandenes Objekt mutieren möchten , verwenden Sie eine Hilfsfunktion.
einstellen
Verwendung:
Karte
Verwendung:
quelle
Sie können die Sets in den Array-Sets zusammenführen
Es ist mir etwas rätselhaft, warum das Folgende, das gleichwertig sein sollte, zumindest in Babel versagt:
quelle
Array.from
nimmt zusätzliche Parameter an, wobei der zweite eine Zuordnungsfunktion ist.Array.prototype.map
Übergibt drei Argumente an seinen Rückruf :(value, index, array)
, also ruft er effektiv aufSets.map((set, index, array) => Array.from(set, index, array)
. Offensichtlichindex
ist eine Zahl und keine Zuordnungsfunktion, so dass es fehlschlägt.Basierend auf Asaf Katz 'Antwort ist hier eine maschinengeschriebene Version:
quelle
Es macht keinen Sinn , aufzurufen,
new Set(...anArrayOrSet)
wenn mehrere Elemente (entweder aus einem Array oder einem anderen Satz) zu einem vorhandenen Satz hinzugefügt werden .Ich benutze dies in einer
reduce
Funktion, und es ist einfach nur albern. Selbst wenn Sie den...array
Spread-Operator zur Verfügung haben, sollten Sie ihn in diesem Fall nicht verwenden, da er Prozessor-, Speicher- und Zeitressourcen verschwendet.Demo-Snippet
quelle
Transformieren Sie die Sets in Arrays, reduzieren Sie sie und schließlich wird der Konstruktor vereinheitlicht.
quelle
Nein, es gibt keine integrierten Operationen für diese, aber Sie können sie ganz einfach selbst erstellen:
quelle
Beispiel
Verwendung
quelle
Sie können die Spread-Syntax verwenden , um sie zusammenzuführen:
quelle
mit Karte zusammenführen
quelle