Saya memiliki objek (parse tree) yang berisi simpul anak yang merupakan referensi ke simpul lain.
Saya ingin membuat serial objek ini, menggunakan JSON.stringify()
, tapi saya mengerti
TypeError: nilai objek siklik
karena konstruk yang saya sebutkan.
Bagaimana saya bisa mengatasi ini? Tidak masalah bagi saya apakah referensi ke node lain diwakili atau tidak dalam objek serial.
Di sisi lain, menghapus properti ini dari objek ketika sedang dibuat tampaknya membosankan dan saya tidak ingin membuat perubahan pada parser (narcissus).
javascript
json
jsonserializer
stringify
Loic Duros
sumber
sumber
cycle.js
jawaban Douglas Crockford di sini, karena ini adalah solusi yang paling tepat untuk banyak kasus. Tampaknya tepat bagi Anda untuk mengirim jawaban itu, karena Anda adalah orang pertama yang merujuknya (dalam komentar Anda di bawah). Jika Anda sendiri tidak ingin mempostingnya sebagai jawaban, saya akhirnya akan melakukannya.Jawaban:
Gunakan parameter kedua dari
stringify
, fungsi replacer , untuk mengecualikan objek yang sudah serial:http://jsfiddle.net/mH6cJ/38/
Seperti yang ditunjukkan dengan benar di komentar lain, kode ini menghapus setiap objek yang "terlihat", tidak hanya yang "rekursif".
Misalnya, untuk:
hasilnya akan salah. Jika struktur Anda seperti ini, Anda mungkin ingin menggunakan decycle Crockford atau fungsi (sederhana) ini yang hanya menggantikan referensi rekursif dengan nol:
sumber
Saya telah membuat GitHub Gist yang dapat mendeteksi struktur siklik dan juga menghapus dan menyandikannya: https://gist.github.com/Hoff97/9842228
Untuk mentransformasikannya cukup gunakan JSONE.stringify / JSONE.parse. Itu juga de- dan mengkodekan fungsi. Jika Anda ingin menonaktifkan ini cukup hapus baris 32-48 dan 61-85.
Anda dapat menemukan contoh biola di sini:
http://jsfiddle.net/hoff97/7UYd4/
sumber
Ini semacam jawaban alternatif, tetapi karena banyak orang akan datang ke sini untuk men-debug objek melingkar mereka dan tidak ada cara yang bagus untuk melakukannya tanpa menarik banyak kode, begini saja.
Salah satu fitur yang tidak begitu terkenal
JSON.stringify()
adalahconsole.table()
. Cukup panggilconsole.table(whatever);
, dan itu akan mencatat variabel di konsol dalam format tabular, membuatnya cukup mudah dan nyaman untuk membaca dengan teliti isi variabel.sumber
lebih hemat dan ini menunjukkan di mana objek siklus berada.
menghasilkan
sumber
obj.b=this'
jika seseorang tahu bagaimana mencegah calcs yang sangat panjang terbuat dari ruang lingkup yang salah denganthis
akan lebih baik untuk melihat di siniseen.indexOf(v) != -1
Saya membuat terlalu proyek github yang dapat membuat serial objek cyclic dan mengembalikan kelas jika Anda menyimpannya dalam atribut serializename seperti String
https://github.com/bormat/serializeStringifyParseCyclicObject
Sunting: Saya telah mengubah skrip saya untuk NPM https://github.com/bormat/borto_circular_serialize dan saya telah mengubah nama fungsi dari bahasa Prancis ke bahasa Inggris.
sumber
Berikut adalah contoh dari struktur data dengan referensi siklik:
Ketika Anda ingin MENJAGA referensi siklik (kembalikan ketika Anda deserialize, daripada "nuking" mereka), Anda memiliki 2 pilihan, yang akan saya bandingkan di sini. Pertama adalah cycle.js Douglas Crockford , kedua adalah paket siberia saya . Keduanya bekerja dengan terlebih dahulu "mendekomposisi" objek, yaitu, membangun objek lain (tanpa referensi siklik) "yang mengandung informasi yang sama."
Mr. Crockford lebih dulu:
Seperti yang Anda lihat, struktur bersarang JSON dipertahankan, tetapi ada hal baru, yaitu objek dengan
$ref
properti khusus . Mari kita lihat cara kerjanya.Tanda dolar berarti root.
.bolt
Setelah$ref
memberitahu kita bahwa itu.bolt
adalah objek "sudah terlihat", dan nilai properti khusus itu (di sini, string $ ["nut"] ["needs"]) memberi tahu kita di mana, lihat pertama di===
atas. Begitu juga untuk yang kedua$ref
dan yang kedua di===
atas.Mari kita gunakan tes kesetaraan mendalam yang sesuai (yaitu
deepGraphEqual
fungsi Anders Kaseorg dari jawaban yang diterima untuk pertanyaan ini ) untuk melihat apakah kloning bekerja.Sekarang, siberia:
Siberia tidak mencoba meniru JSON "klasik", tanpa struktur bersarang. Grafik objek dijelaskan dengan cara "datar". Setiap node dari objek grafik berubah menjadi flat tree (daftar pasangan nilai kunci biasa dengan nilai integer-only), yang merupakan entri di
.forest.
Pada indeks nol, kami menemukan objek root, pada indeks yang lebih tinggi, kami menemukan node lain dari grafik objek, dan nilai-nilai negatif (dari beberapa kunci dari beberapa pohon hutan) menunjuk keatoms
array, (yang diketik melalui array jenis, tetapi kami akan melewatkan detail pengetikan di sini). Semua node terminal ada di tabel atom, semua node non-terminal ada di tabel hutan, dan Anda dapat melihat langsung berapa banyak node yang dimiliki grafik objek, yaituforest.length
. Mari kita coba jika berhasil:perbandingan
akan menambahkan bagian nanti.
sumber
Prasyarat hilang, jika tidak nilai integer dalam objek array terpotong, yaitu [[08.11.2014 12:30:13, 1095]] 1095 akan dikurangi menjadi 095.
sumber