(Ini telah ditambahkan ke perpustakaan saya di GitHub )
Menemukan kembali roda di sini! Tak satu pun dari solusi ini bekerja untuk situasi saya. Jadi, saya cepat-cepat memperbaiki jawaban wilsonpage . Yang ini bukan untuk mencetak ke layar (melalui konsol, atau bidang teks atau apa pun). Ini berfungsi dengan baik dalam situasi itu dan berfungsi dengan baik seperti yang diminta OP alert
. Banyak jawaban di sini tidak membahas menggunakan alert
seperti yang diminta OP. Bagaimanapun, itu diformat untuk transportasi data. Versi ini tampaknya mengembalikan hasil yang sangat mirip toSource()
. Saya belum diuji JSON.stringify
, tetapi saya menganggap ini tentang hal yang sama. Versi ini lebih seperti poli-fil sehingga Anda dapat menggunakannya di lingkungan apa pun. Hasil dari fungsi ini adalah deklarasi objek Javascript yang valid.
Saya tidak akan ragu jika sesuatu seperti ini sudah ada di SO di suatu tempat, tapi itu lebih singkat untuk membuatnya daripada menghabiskan waktu mencari jawaban masa lalu. Dan karena pertanyaan ini adalah top hit saya di google ketika saya mulai mencari tentang ini; Saya pikir meletakkannya di sini mungkin bisa membantu orang lain.
Bagaimanapun, hasil dari fungsi ini akan menjadi representasi string dari objek Anda, bahkan jika objek Anda telah menyematkan objek dan array, dan bahkan jika objek atau array tersebut memiliki objek dan array yang tertanam lebih jauh. (Aku mendengarmu suka minum? Jadi, aku merapikan mobilmu dengan pendingin. Dan kemudian, aku merapikan pendinginmu dengan pendingin. Jadi, pendinginmu bisa minum, sementara kamu menjadi dingin.)
Array disimpan dengan []
alih - alih {}
dan karenanya tidak memiliki pasangan kunci / nilai, hanya nilai. Seperti array biasa. Oleh karena itu, mereka dibuat seperti array lakukan.
Juga, semua string (termasuk nama kunci) dikutip, ini tidak perlu kecuali string tersebut memiliki karakter khusus (seperti spasi atau garis miring). Tapi, saya tidak merasa ingin mendeteksi ini hanya untuk menghapus beberapa tanda kutip yang mungkin masih berfungsi dengan baik.
String yang dihasilkan ini kemudian dapat digunakan dengan eval
atau hanya membuangnya ke var melalui manipulasi string. Dengan demikian, buat kembali objek Anda lagi, dari teks.
function ObjToSource(o){
if (!o) return 'null';
var k="",na=typeof(o.length)=="undefined"?1:0,str="";
for(var p in o){
if (na) k = "'"+p+ "':";
if (typeof o[p] == "string") str += k + "'" + o[p]+"',";
else if (typeof o[p] == "object") str += k + ObjToSource(o[p])+",";
else str += k + o[p] + ",";
}
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
Beri tahu saya jika saya mengacaukan semuanya, berfungsi dengan baik dalam pengujian saya. Juga, satu-satunya cara saya bisa memikirkan untuk mendeteksi tipe array
adalah untuk memeriksa keberadaan length
. Karena Javascript benar-benar menyimpan array sebagai objek, saya tidak dapat benar-benar memeriksa tipe array
(tidak ada tipe seperti itu!). Jika ada orang lain yang tahu cara yang lebih baik, saya akan senang mendengarnya. Karena, jika objek Anda juga memiliki properti bernama length
maka fungsi ini keliru akan memperlakukannya sebagai array.
EDIT: Menambahkan cek untuk objek bernilai nol. Terima kasih Brock Adams
EDIT: Di bawah ini adalah fungsi tetap untuk dapat mencetak objek rekursif tanpa batas. Ini tidak mencetak sama seperti toSource
dari FF karena toSource
akan mencetak rekursi tak terbatas satu kali, sedangkan, fungsi ini akan membunuhnya segera. Fungsi ini berjalan lebih lambat daripada yang di atas, jadi saya menambahkannya di sini alih-alih mengedit fungsi di atas, karena hanya diperlukan jika Anda berencana untuk meneruskan objek yang menghubungkan kembali ke diri mereka sendiri, di suatu tempat.
const ObjToSource=(o)=> {
if (!o) return null;
let str="",na=0,k,p;
if (typeof(o) == "object") {
if (!ObjToSource.check) ObjToSource.check = new Array();
for (k=ObjToSource.check.length;na<k;na++) if (ObjToSource.check[na]==o) return '{}';
ObjToSource.check.push(o);
}
k="",na=typeof(o.length)=="undefined"?1:0;
for(p in o){
if (na) k = "'"+p+"':";
if (typeof o[p] == "string") str += k+"'"+o[p]+"',";
else if (typeof o[p] == "object") str += k+ObjToSource(o[p])+",";
else str += k+o[p]+",";
}
if (typeof(o) == "object") ObjToSource.check.pop();
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
Uji:
var test1 = new Object();
test1.foo = 1;
test1.bar = 2;
var testobject = new Object();
testobject.run = 1;
testobject.fast = null;
testobject.loop = testobject;
testobject.dup = test1;
console.log(ObjToSource(testobject));
console.log(testobject.toSource());
Hasil:
{'run':1,'fast':null,'loop':{},'dup':{'foo':1,'bar':2}}
({run:1, fast:null, loop:{run:1, fast:null, loop:{}, dup:{foo:1, bar:2}}, dup:{foo:1, bar:2}})
CATATAN: Mencoba mencetak document.body
adalah contoh yang mengerikan. Untuk satu, FF hanya mencetak string objek kosong saat menggunakan toSource
. Dan ketika menggunakan fungsi di atas, FF crash SecurityError: The operation is insecure.
. Dan Chrome akan mogok Uncaught RangeError: Maximum call stack size exceeded
. Jelas, document.body
itu tidak dimaksudkan untuk dikonversi menjadi string. Karena terlalu besar, atau menentang kebijakan keamanan untuk mengakses properti tertentu. Kecuali, saya mengacaukan sesuatu di sini, katakan!