Czy istnieje prosty sposób na scalenie map ES6 razem (np. Object.assign
)? A skoro już o tym mowa, co z zestawami ES6 (takimi jak Array.concat
)?
javascript
set
ecmascript-6
jameslk
źródło
źródło
for..of
ponieważkey
może być dowolnego typuOdpowiedzi:
Do zestawów:
W przypadku map:
Zauważ, że jeśli wiele map ma ten sam klucz, wartość scalonej mapy będzie wartością ostatniej scalonej mapy z tym kluczem.
źródło
Map
: „Konstruktor:new Map([iterable])
”, „iterable
to tablica lub inny iterowalny obiekt, którego elementy są parami klucz-wartość (tablice 2-elementowe). Każda para klucz-wartość jest dodawana do nowej mapy ”. - tylko jako odniesienie.Map
konstruktora pozwala uniknąć zużycia pamięci.Oto moje rozwiązanie wykorzystujące generatory:
Mapy:
Zestawy:
źródło
m2.forEach((k,v)=>m1.set(k,v))
jeśli chcesz mieć łatwą obsługę przeglądarkiZ powodów, których nie rozumiem, nie można bezpośrednio dodawać zawartości jednego zestawu do drugiego za pomocą wbudowanej operacji. Operacje takie jak sumowanie, przecinanie, scalanie itp. Są dość podstawowymi operacjami na zbiorach, ale nie są wbudowane. Na szczęście możesz dość łatwo zbudować je samodzielnie.
Tak więc, aby zaimplementować operację scalania (scalanie zawartości jednego zestawu w inny lub jednej mapy w inną), możesz to zrobić za pomocą jednej
.forEach()
linii:I na przykład
Map
możesz to zrobić:Lub w składni ES6:
FYI, jeśli chcesz mieć prostą podklasę wbudowanego
Set
obiektu, który zawiera.merge()
metodę, możesz użyć tego:Ma to być w swoim własnym pliku setex.js, który możesz następnie
require()
umieścić w node.js i użyć zamiast wbudowanego zestawu.źródło
new Set(s, t)
. Pracuje.t
Parametr jest ignorowany. Ponadto oczywiście nie jest rozsądnym zachowaniemadd
wykrywanie typu swojego parametru i dodanie do zestawu elementów zestawu, ponieważ wtedy nie byłoby sposobu, aby dodać sam zestaw do zestawu..add()
metody zrobienia zestawu, rozumiem twój punkt widzenia. Po prostu uważam, że jest to o wiele mniej przydatne niż możliwość łączenia zestawów za pomocą,.add()
ponieważ nigdy nie potrzebowałem zestawu ani zestawów, ale wielokrotnie musiałem łączyć zestawy. Tylko kwestia opinii o przydatności jednego zachowania do drugiego.n.forEach(m.add, m)
- odwraca pary klucz / wartość!Map.prototype.forEach()
iMap.prototype.set()
mam odwrócone argumenty. Wygląda na to, że ktoś przeoczył. Wymusza więcej kodu, gdy próbuje się ich używać razem.set
kolejność parametrów jest naturalna dla par klucz / wartość,forEach
jest dopasowana do metodyArray
sforEach
(i rzeczy takie jak$.each
lub,_.each
które również wyliczają obiekty).Oryginalna odpowiedź
Chciałbym zasugerować inne podejście, użycie
reduce
ispread
operatora:Realizacja
Stosowanie:
Wskazówka:
Możemy również skorzystać z
rest
operatora, aby uczynić interfejs nieco ładniejszym:Teraz, zamiast przekazywać tablicę zbiorów, możemy przekazać dowolną liczbę argumentów zbiorów:
źródło
forof
iadd
, które wydaje się po prostu bardzo nieefektywne. Naprawdę chciałbym miećaddAll(iterable)
metodę nafunction union<T> (...iterables: Array<Set<T>>): Set<T> { const set = new Set<T>(); iterables.forEach(iterable => { iterable.forEach(item => set.add(item)) }) return set }
Zatwierdzona odpowiedź jest świetna, ale za każdym razem tworzy nowy zestaw.
Jeśli chcesz mutować zamiast tego istniejący obiekt, użyj funkcji pomocniczej.
Zestaw
Stosowanie:
Mapa
Stosowanie:
źródło
Aby scalić zestawy w zestawach szyku, możesz to zrobić
Jest dla mnie nieco tajemnicze, dlaczego poniższe, które powinny być równoważne, zawodzą przynajmniej w Babel:
źródło
Array.from
przyjmuje dodatkowe parametry, z których drugi to funkcja mapująca.Array.prototype.map
przekazuje trzy argumenty do swojego wywołania zwrotnego:,(value, index, array)
więc skutecznie wywołujeSets.map((set, index, array) => Array.from(set, index, array)
. Oczywiścieindex
jest liczbą, a nie funkcją mapującą, więc zawodzi.Na podstawie odpowiedzi Asaf Katza, oto wersja maszynopisu:
źródło
Nie ma sensu wywoływać
new Set(...anArrayOrSet)
podczas dodawania wielu elementów (z tablicy lub innego zestawu) do istniejącego zestawu .Używam tego w
reduce
funkcji i jest to po prostu głupie. Nawet jeśli masz...array
dostępny operator rozproszenia, nie powinieneś go używać w tym przypadku, ponieważ powoduje to marnowanie zasobów procesora, pamięci i czasu.Fragment demo
źródło
Przekształć zestawy w tablice, spłaszcz je, a na koniec konstruktor ujednolici.
źródło
Nie, nie ma dla nich wbudowanych operacji, ale możesz łatwo utworzyć własne:
źródło
Przykład
Stosowanie
źródło
Możesz użyć składni rozkładów, aby połączyć je ze sobą:
źródło
połącz z Mapą
źródło