Existe uma maneira simples de mesclar o ES6 Maps (como Object.assign
)? E enquanto estamos nisso, o que dizer dos Conjuntos ES6 (como Array.concat
)?
javascript
set
ecmascript-6
jameslk
fonte
fonte
for..of
poiskey
pode ser de qualquer tipo #Respostas:
Para conjuntos:
Para mapas:
Observe que se vários mapas tiverem a mesma chave, o valor do mapa mesclado será o valor do último mapa mesclado com essa chave.
fonte
Map
: “Construtor:new Map([iterable])
”, “iterable
é uma matriz ou outro objeto iterável cujos elementos são pares de valores-chave (matrizes de 2 elementos). Cada par de valores-chave é adicionado ao novo mapa. ” - apenas como referência.Map
construtor evita o consumo de memória.Aqui está minha solução usando geradores:
Para mapas:
Para conjuntos:
fonte
m2.forEach((k,v)=>m1.set(k,v))
se você quiser suporte ao navegador fácilPor razões que não entendo, você não pode adicionar diretamente o conteúdo de um conjunto a outro com uma operação interna. Operações como união, interseção, mesclagem, etc ... são operações de conjunto bastante básicas, mas não são integradas. Felizmente, você pode construir tudo isso com bastante facilidade.
Portanto, para implementar uma operação de mesclagem (mesclando o conteúdo de um conjunto em outro ou de um mapa em outro), você pode fazer isso com uma única
.forEach()
linha:E, para um
Map
, você pode fazer o seguinte:Ou, na sintaxe do ES6:
Para sua informação, se você deseja uma subclasse simples do
Set
objeto interno que contém um.merge()
método, pode usar o seguinte:Isso deve estar em seu próprio arquivo setex.js, que você poderá
require()
usar no node.js e usar no lugar do conjunto interno.fonte
new Set(s, t)
. trabalho. Ot
parâmetro é ignorado. Além disso, obviamente não é um comportamento razoáveladd
detectar o tipo de seu parâmetro e se um conjunto adicionar os elementos do conjunto, porque não haveria como adicionar um conjunto a um conjunto..add()
método de fazer um set, entendo seu ponto de vista. Eu acho isso muito menos útil do que ser capaz de combinar conjuntos usando.add()
como nunca precisei de um conjunto ou conjuntos, mas tive a necessidade de mesclar conjuntos muitas vezes. Apenas uma questão de opinião sobre a utilidade de um comportamento versus o outro.n.forEach(m.add, m)
- inverte pares chave / valor!Map.prototype.forEach()
eMap.prototype.set()
tenham invertido argumentos. Parece uma supervisão de alguém. Isso força mais código ao tentar usá-los juntos.set
a ordem dos parâmetros é natural para pares de chave / valor,forEach
está alinhada comArray
oforEach
método s (e coisas como$.each
ou_.each
que também enumeram objetos).Resposta original
Gostaria de sugerir outra abordagem, usando
reduce
e ospread
operador:Implementação
Uso:
Dica:
Também podemos usar o
rest
operador para tornar a interface um pouco melhor:Agora, em vez de passar uma matriz de conjuntos, podemos passar um número arbitrário de argumentos de conjuntos:
fonte
forof
eadd
, o que parece ser muito ineficiente. Eu realmente gostaria de umaddAll(iterable)
método em Conjuntosfunction union<T> (...iterables: Array<Set<T>>): Set<T> { const set = new Set<T>(); iterables.forEach(iterable => { iterable.forEach(item => set.add(item)) }) return set }
A resposta aprovada é ótima, mas isso cria um novo conjunto sempre.
Se você deseja modificar um objeto existente, use uma função auxiliar.
Conjunto
Uso:
Mapa
Uso:
fonte
Para mesclar os conjuntos na matriz Conjuntos, você pode fazer
É um pouco misterioso para mim por que o seguinte, que deveria ser equivalente, falha pelo menos em Babel:
fonte
Array.from
usa parâmetros adicionais, o segundo sendo uma função de mapeamento.Array.prototype.map
passa três argumentos para seu retorno de chamada:,(value, index, array)
portanto está efetivamente chamandoSets.map((set, index, array) => Array.from(set, index, array)
. Obviamente,index
é um número e não uma função de mapeamento, portanto falha.Baseado na resposta de Asaf Katz, aqui está uma versão datilografada:
fonte
Não faz sentido chamar
new Set(...anArrayOrSet)
ao adicionar vários elementos (de uma matriz ou de outro conjunto) a um conjunto existente .Eu uso isso em uma
reduce
função, e é simplesmente bobo. Mesmo se você tiver o...array
operador spread disponível, não deve usá-lo nesse caso, pois desperdiça recursos de processador, memória e tempo.Snippet de demonstração
fonte
Transforme os conjuntos em matrizes, alise-os e, finalmente, o construtor se unificará.
fonte
Não, não há operações internas para elas, mas você pode criá-las facilmente:
fonte
Exemplo
Uso
fonte
Você pode usar a sintaxe de propagação para mesclá-los:
fonte
mesclar para mapear
fonte