Apakah ada cara sederhana untuk menggabungkan ES6 Maps bersama (seperti Object.assign
)? Dan sementara kita melakukannya, bagaimana dengan ES6 Sets (seperti Array.concat
)?
javascript
set
ecmascript-6
jameslk
sumber
sumber
for..of
karenakey
dapat jenis apa punJawaban:
Untuk set:
Untuk peta:
Perhatikan bahwa jika beberapa peta memiliki kunci yang sama, nilai peta yang digabungkan akan menjadi nilai peta gabungan terakhir dengan kunci itu.
sumber
Map
: "Konstruktor:new Map([iterable])
", "iterable
adalah Array atau objek lain yang dapat diulang-ulang yang unsur-unsurnya adalah pasangan nilai kunci (Array 2-elemen). Setiap pasangan nilai kunci ditambahkan ke Peta baru. " - hanya sebagai referensi.Map
konstruktor akan menghindari konsumsi memori mereka.Inilah solusi saya menggunakan generator:
Untuk Peta:
Untuk Set:
sumber
m2.forEach((k,v)=>m1.set(k,v))
jika Anda menginginkan dukungan browser yang mudahUntuk alasan yang saya tidak mengerti, Anda tidak dapat langsung menambahkan konten dari satu Set ke yang lain dengan operasi bawaan. Operasi seperti union, intersect, merge, dll ... adalah operasi set yang cukup mendasar, tetapi tidak terintegrasi. Untungnya, Anda dapat membangun semua ini sendiri dengan cukup mudah.
Jadi, untuk menerapkan operasi penggabungan (menggabungkan konten dari satu Set ke yang lain atau satu Peta ke yang lain), Anda dapat melakukan ini dengan satu
.forEach()
baris:Dan, untuk a
Map
, Anda bisa melakukan ini:Atau, dalam sintaks ES6:
FYI, jika Anda menginginkan subkelas sederhana dari
Set
objek bawaan yang berisi.merge()
metode, Anda bisa menggunakan ini:Ini dimaksudkan untuk berada di file setex.js sendiri yang kemudian bisa Anda
require()
masuki ke node.js dan digunakan sebagai pengganti Set bawaan .sumber
new Set(s, t)
. bekerja. Thet
parameter diabaikan. Selain itu, jelas bukan perilaku yang masuk akal untukadd
mendeteksi tipe parameternya dan jika suatu himpunan menambahkan elemen himpunan, karena dengan demikian tidak akan ada cara untuk menambahkan himpunan itu sendiri ke himpunan..add()
metode pengambilan Set, saya mengerti maksud Anda. Saya hanya menemukan bahwa penggunaan yang jauh lebih sedikit daripada kemampuan untuk menggabungkan set menggunakan.add()
karena saya tidak pernah memiliki kebutuhan untuk Set atau Set, tetapi saya memiliki kebutuhan untuk menggabungkan set berkali-kali. Hanya masalah pendapat tentang kegunaan dari satu perilaku vs yang lain.n.forEach(m.add, m)
- itu membalikkan pasangan kunci / nilai!Map.prototype.forEach()
danMap.prototype.set()
memiliki argumen yang terbalik. Sepertinya pengawasan oleh seseorang. Ini memaksa lebih banyak kode ketika mencoba menggunakannya bersama-sama.set
urutan parameter adalah alami untuk pasangan kunci / nilai,forEach
disejajarkan dengan metodeArray
sforEach
(dan hal-hal seperti$.each
atau_.each
yang juga menyebutkan objek).Jawaban Asli
Saya ingin menyarankan pendekatan lain, menggunakan
reduce
danspread
operator:Penerapan
Pemakaian:
Tip:
Kami juga dapat menggunakan
rest
operator untuk membuat antarmuka sedikit lebih baik:Sekarang, alih-alih melewati array set, kita dapat melewati sejumlah argumen set arbitrary :
sumber
forof
danadd
, yang sepertinya sangat tidak efisien. Saya benar-benar berharap untuk sebuahaddAll(iterable)
metode pada 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 }
Jawaban yang disetujui bagus tetapi itu membuat set baru setiap saat.
Jika Anda ingin bermutasi objek yang ada, gunakan fungsi helper.
Set
Pemakaian:
Peta
Pemakaian:
sumber
Untuk menggabungkan set di set array, Anda bisa melakukannya
Bagiku sedikit misterius mengapa yang berikut, yang seharusnya setara, setidaknya gagal di Babel:
sumber
Array.from
mengambil parameter tambahan, yang kedua adalah fungsi pemetaan.Array.prototype.map
melewati tiga argumen ke callback nya:,(value, index, array)
jadi itu secara efektif memanggilSets.map((set, index, array) => Array.from(set, index, array)
. Jelas,index
itu angka dan bukan fungsi pemetaan sehingga gagal.Didasarkan atas jawaban Asaf Katz, berikut ini adalah versi naskah:
sumber
Tidak masuk akal untuk memanggil
new Set(...anArrayOrSet)
ketika menambahkan beberapa elemen (dari array atau set lain) ke set yang ada .Saya menggunakan ini dalam suatu
reduce
fungsi, dan itu benar-benar konyol. Bahkan jika Anda memiliki...array
operator spread, Anda tidak boleh menggunakannya dalam kasus ini, karena ia memboroskan sumber daya prosesor, memori, dan waktu.Cuplikan Demo
sumber
Ubah set ke dalam array, ratakan mereka dan akhirnya konstruktor akan menyatukan.
sumber
Tidak, tidak ada operasi builtin untuk ini, tetapi Anda dapat dengan mudah membuatnya sendiri:
sumber
Contoh
Pemakaian
sumber
Anda bisa menggunakan sintaks spread untuk menggabungkannya:
sumber
bergabung ke Map
sumber