¿Hay una manera simple de fusionar ES6 Maps (como Object.assign
)? Y mientras estamos en eso, ¿qué pasa con los conjuntos ES6 (como Array.concat
)?
javascript
set
ecmascript-6
jameslk
fuente
fuente
for..of
porquekey
puede ser de cualquier tipoRespuestas:
Para conjuntos:
Para mapas:
Tenga en cuenta que si varios mapas tienen la misma clave, el valor del mapa fusionado será el valor del último mapa fusionado con esa clave.
fuente
Map
: "Constructor:new Map([iterable])
", "iterable
es una matriz u otro objeto iterable cuyos elementos son pares clave-valor (matrices de 2 elementos). Cada par clave-valor se agrega al nuevo Mapa ". - Solo como referencia.Map
constructor evita su consumo de memoria.Aquí está mi solución usando generadores:
Para mapas:
Para conjuntos:
fuente
m2.forEach((k,v)=>m1.set(k,v))
si quieres un soporte de navegador fácilPor razones que no entiendo, no puede agregar directamente el contenido de un conjunto a otro con una operación integrada. Operaciones como unión, intersección, fusión, etc. son operaciones de conjunto bastante básicas, pero no están integradas. Afortunadamente, puede construir todo esto usted mismo con bastante facilidad.
Entonces, para implementar una operación de fusión (fusionar el contenido de un Conjunto en otro o un Mapa en otro), puede hacer esto con una sola
.forEach()
línea:Y, por un lado
Map
, podrías hacer esto:O, en la sintaxis de ES6:
Para su información, si desea una subclase simple del
Set
objeto incorporado que contiene un.merge()
método, puede usar esto:Está destinado a estar en su propio archivo setex.js que luego puede
require()
ingresar a node.js y usar en lugar del conjunto incorporado.fuente
new Set(s, t)
. trabajos. Elt
parámetro se ignora. Además, obviamente no es un comportamiento razonable tener queadd
detectar el tipo de su parámetro y si un conjunto agrega los elementos del conjunto, porque entonces no habría forma de agregar un conjunto a un conjunto..add()
método que toma un Set, entiendo tu punto. Simplemente encuentro que es mucho menos útil que poder combinar conjuntos usando.add()
ya que nunca he necesitado un Conjunto o Conjuntos, pero he tenido la necesidad de fusionar conjuntos muchas veces. Solo es una cuestión de opinión sobre la utilidad de un comportamiento frente al otro.n.forEach(m.add, m)
invierte pares clave / valor!Map.prototype.forEach()
yMap.prototype.set()
han invertido argumentos. Parece un descuido de alguien. Fuerza más código cuando intenta usarlos juntos.set
El orden de los parámetros es natural para los pares clave / valor,forEach
está alineado conArray
elforEach
método s (y cosas como$.each
o_.each
que también enumeran objetos).Respuesta original
Me gustaría sugerir otro enfoque, el uso
reduce
y elspread
operador:Implementación
Uso:
Propina:
También podemos hacer uso del
rest
operador para que la interfaz sea un poco más agradable:Ahora, en lugar de pasar una serie de conjuntos, podemos pasar un número arbitrario de argumentos de conjuntos:
fuente
forof
yadd
, lo que parece muy ineficiente. Realmente deseo unaddAll(iterable)
método en 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 respuesta aprobada es excelente, pero eso crea un nuevo conjunto cada vez.
Si en su lugar desea mutar un objeto existente, use una función auxiliar.
Conjunto
Uso:
Mapa
Uso:
fuente
Para fusionar los conjuntos en la matriz Conjuntos, puede hacer
Es un poco misterioso para mí por qué lo siguiente, que debería ser equivalente, falla al menos en Babel:
fuente
Array.from
toma parámetros adicionales, el segundo es una función de mapeo.Array.prototype.map
pasa tres argumentos a su devolución de llamada:(value, index, array)
por lo que está llamando efectivamenteSets.map((set, index, array) => Array.from(set, index, array)
. Obviamente,index
es un número y no una función de mapeo, por lo que falla.Basado en la respuesta de Asaf Katz, aquí hay una versión mecanografiada:
fuente
No tiene ningún sentido llamar
new Set(...anArrayOrSet)
cuando se agregan múltiples elementos (desde una matriz u otro conjunto) a un conjunto existente .Lo uso en una
reduce
función, y es simplemente tonto. Incluso si tiene el...array
operador de propagación disponible, no debe usarlo en este caso, ya que desperdicia recursos de procesador, memoria y tiempo.Fragmento de demostración
fuente
Transforme los conjuntos en matrices, aplánelos y finalmente el constructor se unificará.
fuente
No, no hay operaciones integradas para estas, pero puede crearlas fácilmente:
fuente
Ejemplo
Uso
fuente
Puede usar la sintaxis de propagación para fusionarlos:
fuente
fusionar al mapa
fuente