Saya ingin mulai menggunakan Peta ES6 daripada objek JS tetapi saya ditahan karena saya tidak tahu cara JSON.stringify () Peta. Kunci saya dijamin berupa string dan nilai saya akan selalu dicantumkan. Apakah saya benar-benar harus menulis metode pembungkus untuk membuat serial?
105
[...someMap.entries()].join(';')
; untuk sesuatu yang lebih kompleks, Anda dapat mencoba sesuatu yang serupa menggunakan sesuatu seperti[...someMap.entries()].reduce((acc, cur) => acc + `${cur[0]}:${/* do something to stringify cur[1] */ }`, '')
obj[key]
mungkin memberi Anda sesuatu yang tidak terduga. Pertimbangkan kasusnyaif (!obj[key]) obj[key] = newList; else obj[key].mergeWith(newList);
.Jawaban:
Tidak boleh.
Kunci peta bisa apa saja, termasuk objek. Tetapi sintaks JSON hanya mengizinkan string sebagai kunci. Jadi tidak mungkin dalam kasus umum.
Dalam hal ini, Anda dapat menggunakan objek biasa. Ini akan memiliki keuntungan berikut:
sumber
hasOwnProperty
. Tanpa itu, Firefox melakukan iterasi objek jauh lebih cepat daripada peta. Maps masih lebih cepat di Chrome. jsperf.com/es6-map-vs-object-properties/95Anda tidak dapat langsung merangkai
Map
instance karena tidak memiliki properti apa pun, tetapi Anda dapat mengonversinya menjadi array tupel:Untuk kebalikannya, gunakan
sumber
Map
s, ini cocok dengan konstruktor dan iterator. Juga merupakan satu-satunya representasi peta yang memiliki kunci non-string, dan objek tidak akan berfungsi di sana.JSON.stringify(Object.fromEntries(map.entries()))
dannew Map(Object.entries(JSON.parse(jsonText)))
key
adalah objek misalnya"{"[object Object]":{"b":2}}"
- kunci objek menjadi salah satu fitur utama MapsKeduanya
JSON.stringify
danJSON.parse
mendukung argumen kedua.replacer
danreviver
masing - masing. Dengan replacer dan reviver di bawahnya, Anda dapat menambahkan dukungan untuk objek Map asli, termasuk nilai yang sangat bertingkatPenggunaan :
Deep nesting dengan kombinasi Array, Objects, dan Maps
sumber
Meskipun belum ada metode yang disediakan oleh ecmascript, ini masih dapat dilakukan
JSON.stingify
jika Anda memetakanMap
ke JavaScript primitif. Ini contoh yangMap
akan kami gunakan.Pergi ke Objek JavaScript
Anda dapat mengonversi ke literal Objek JavaScript dengan fungsi pembantu berikut.
Pergi ke JavaScript Array of Objects
Fungsi helper untuk yang satu ini akan lebih ringkas
Pergi ke Array of Arrays
Ini bahkan lebih mudah, Anda bisa menggunakan
sumber
Menggunakan peta sytax tersebar dapat diserialkan dalam satu baris:
dan deserialisasi dengan:
sumber
Merangkai sebuah
Map
instance (objek sebagai kunci OK) :atau
atau
format output:
sumber
Solusi yang Lebih Baik
Keluaran
Harapan yang kurang ngeri dari jawaban di atas.
sumber
IJSONAble
antarmuka kecil (tentu saja menggunakan TypeScript).Solusi di bawah ini berfungsi bahkan jika Anda memiliki Peta bersarang
sumber
Map
dan (bahkan lebih buruk) bahwa setiap sub-peta (yang ada di dalamnya) juga aslinya adalah peta. Jika tidak, tidak ada cara untuk memastikan bahwa anarray of pairs
tidak hanya dimaksudkan untuk menjadi persis seperti itu, alih-alih Peta. Hierarki objek dan larik tidak membawa beban ini saat diurai. Setiap serialisasi yang tepatMap
akan secara eksplisit menunjukkan bahwa itu adalah aMap
.