Existe-t-il un moyen simple de fusionner des cartes ES6 ensemble (comme Object.assign
)? Et pendant que nous y sommes, qu'en est-il des ensembles ES6 (comme Array.concat
)?
javascript
set
ecmascript-6
Jameslk
la source
la source
for..of
car ilkey
peut s'agir de n'importe quel typeRéponses:
Pour les ensembles:
Pour les cartes:
Notez que si plusieurs cartes ont la même clé, la valeur de la carte fusionnée sera la valeur de la dernière carte fusionnée avec cette clé.
la source
Map
: «Constructor:new Map([iterable])
», «iterable
est un tableau ou un autre objet itérable dont les éléments sont des paires clé-valeur (tableaux à 2 éléments). Chaque paire clé-valeur est ajoutée à la nouvelle carte. » - juste comme référence.Map
constructeur évite sa consommation de mémoire.Voici ma solution utilisant des générateurs:
Pour les cartes:
Pour les ensembles:
la source
m2.forEach((k,v)=>m1.set(k,v))
si vous voulez un support de navigateur facilePour des raisons que je ne comprends pas, vous ne pouvez pas ajouter directement le contenu d'un ensemble à un autre avec une opération intégrée. Les opérations comme l'union, l'intersection, la fusion, etc. sont des opérations d'ensemble assez basiques, mais ne sont pas intégrées. Heureusement, vous pouvez tout construire vous-même assez facilement.
Ainsi, pour implémenter une opération de fusion (fusionner le contenu d'un ensemble dans un autre ou d'une carte dans une autre), vous pouvez le faire avec une seule
.forEach()
ligne:Et, pour un
Map
, vous pouvez faire ceci:Ou, dans la syntaxe ES6:
Pour info, si vous voulez une simple sous-classe de l'
Set
objet intégré qui contient une.merge()
méthode, vous pouvez utiliser ceci:Ceci est censé être dans son propre fichier setex.js que vous pouvez ensuite
require()
utiliser dans node.js et utiliser à la place du Set intégré.la source
new Set(s, t)
. travaux. Let
paramètre est ignoré. Aussi, ce n'est évidemment pas un comportement raisonnable d'avoiradd
détecté le type de son paramètre et si un ensemble ajoute les éléments de l'ensemble, car alors il n'y aurait aucun moyen d'ajouter un ensemble lui-même à un ensemble..add()
méthode prenant un Set, je comprends votre point. Je trouve juste que cela est beaucoup moins utile que de pouvoir combiner des ensembles en utilisant.add()
car je n'ai jamais eu besoin d'un ensemble ou d'ensembles, mais j'ai eu besoin de fusionner des ensembles plusieurs fois. Juste une question d'opinion sur l'utilité d'un comportement par rapport à l'autre.n.forEach(m.add, m)
- cela inverse les paires clé / valeur!Map.prototype.forEach()
etMap.prototype.set()
avoir des arguments inversés. Cela ressemble à un oubli de quelqu'un. Cela force plus de code lorsque vous essayez de les utiliser ensemble.set
L'ordre des paramètres est naturel pour les paires clé / valeur,forEach
est aligné sur la méthodeArray
sforEach
(et des choses comme$.each
ou_.each
qui énumèrent également des objets).Réponse originale
Je voudrais proposer une autre approche, en utilisant
reduce
et l'spread
opérateur:la mise en oeuvre
Usage:
Pointe:
Nous pouvons également utiliser l'
rest
opérateur pour rendre l'interface un peu plus agréable:Maintenant, au lieu de passer un tableau d'ensembles, nous pouvons passer un nombre arbitraire d' arguments d'ensembles:
la source
forof
etadd
, qui semble tout simplement très inefficace. Je souhaite vraiment uneaddAll(iterable)
méthode sur les 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 }
La réponse approuvée est excellente, mais cela crée un nouvel ensemble à chaque fois.
Si vous souhaitez faire muter un objet existant à la place, utilisez une fonction d'assistance.
Ensemble
Usage:
Carte
Usage:
la source
Pour fusionner les ensembles dans le tableau Ensembles, vous pouvez faire
Il est un peu mystérieux pour moi pourquoi ce qui suit, qui devrait être équivalent, échoue au moins à Babel:
la source
Array.from
prend des paramètres supplémentaires, le second étant une fonction de mappage.Array.prototype.map
passe trois arguments à son callback:,(value, index, array)
donc il appelle effectivementSets.map((set, index, array) => Array.from(set, index, array)
. De toute évidence, ilindex
s'agit d'un nombre et non d'une fonction de mappage, donc cela échoue.Basé sur la réponse d'Asaf Katz, voici une version dactylographiée:
la source
Cela n'a aucun sens d'appeler
new Set(...anArrayOrSet)
lors de l'ajout de plusieurs éléments (à partir d'un tableau ou d'un autre ensemble) à un ensemble existant .J'utilise ceci dans une
reduce
fonction, et c'est tout simplement idiot. Même si vous disposez de l'...array
opérateur de diffusion, vous ne devez pas l'utiliser dans ce cas, car il gaspille des ressources de processeur, de mémoire et de temps.Extrait de démonstration
la source
Transformez les ensembles en tableaux, aplatissez-les et finalement le constructeur s'unifiera.
la source
Non, il n'y a pas d'opérations intégrées pour ceux-ci, mais vous pouvez facilement les créer vous-même:
la source
Exemple
Usage
la source
Vous pouvez utiliser la syntaxe de diffusion pour les fusionner:
la source
fusionner avec la carte
la source