(Bu GitHub'daki kütüphaneme eklendi )
Burada tekerleği yeniden icat etmek! Bu çözümlerin hiçbiri benim durumum için işe yaramadı. Bu yüzden çabucak wilsonpage'in cevabını doktora yazdım . Bu, ekrana yazdırmak için değildir (konsol, metin alanı veya herhangi bir şey yoluyla). Bu durumlarda iyi çalışıyor ve OP'nin istediği gibi çalışıyor alert
. Buradaki birçok yanıt alert
OP'nin istediği gibi kullanılmıyor . Her neyse, Ancak, veri aktarımı için biçimlendirilmiştir. Bu sürüm çok benzer bir sonuç döndürüyor gibi görünüyor toSource()
. Test JSON.stringify
etmedim, ama bunun aynı şey olduğunu varsayıyorum. Bu sürüm daha çok bir poli-fil gibidir, böylece herhangi bir ortamda kullanabilirsiniz. Bu işlevin sonucu, geçerli bir Javascript nesnesi bildirimidir.
Böyle bir şey zaten SO bir yerde olsaydı şüphe etmem, ama geçmiş cevapları ararken bir süre harcamak daha yapmak için daha kısa oldu. Ve bu soru, bu konuda arama yapmaya başladığımda google'daki en iyi hitim olduğu için; Buraya koymak başkalarına yardımcı olabilir düşündüm.
Her neyse, bu fonksiyonun sonucu, nesneniz gömülü nesneler ve diziler olsa bile ve bu nesneler veya diziler daha da gömülü nesneler ve diziler içeriyor olsa bile, nesnenizin bir dize temsili olacaktır. (İçki içmeyi sevdiğini duydum? Yani, arabanı bir soğutucu ile püskürttüm. Ve sonra, soğutucunu bir soğutucu ile püskürttüm. Böylece, soğutucun senin serinken içebilir.)
Diziler []
yerine ile depolanır{}
ve bu nedenle anahtar / değer çiftlerine değil, sadece değerlere sahiptir. Normal diziler gibi. Bu nedenle, diziler gibi yaratılırlar.
Ayrıca, tüm dize (anahtar adları dahil) alıntılanmıştır, bu dizelerde özel karakterler (boşluk veya eğik çizgi gibi) olmadığı sürece bu gerekli değildir. Ancak, sadece hala işe yarayacak bazı tırnak kaldırmak için bunu tespit etmek gibi hissetmedim.
Bu sonuçtaki dize daha sonra eval
dize manipülasyonu ile kullanılabilir ya da sadece dize manipülasyonu ile boşaltılabilir. Böylece, nesnenizi metinden yeniden oluşturun.
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)+"]";
}
Her şeyi berbat edersem bana bildirin, testlerimde iyi çalışıyor. Ayrıca, türü algılamayı düşünebildiğim tek yol array
varlığını kontrol etmekti length
. Javascript gerçekten nesneleri nesne olarak depoladığından, aslında türü kontrol edemiyorum array
(böyle bir tür yok!). Başka biri daha iyi bir yol bilirse, duymak isterim. Çünkü, nesnenizde ayrıcalength
bu işlev yanlışlıkla bir dizi olarak ele alınır.
EDIT: Boş değerli nesneler için kontrol eklendi. Teşekkürler Brock Adams
EDIT: Sonsuz özyinelemeli nesneler yazdırabilmek için sabit fonksiyon aşağıdadır. Bu, toSource
FF ile aynı toSource
şekilde yazdırılmaz, çünkü sonsuz özyinelemeyi bir kez yazdıracak, burada bu işlev hemen öldürecektir. Bu işlev yukarıdaki işlevden daha yavaş çalışır, bu yüzden yukarıdaki işlevi düzenlemek yerine buraya ekliyorum, çünkü yalnızca kendilerine, bir yere geri bağlanan nesneleri iletmeyi planlıyorsanız gereklidir.
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)+"]";
}
Ölçek:
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());
Sonuç:
{'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}})
NOT: Yazdırmaya çalışmak document.body
korkunç bir örnektir. Birincisi, FF kullanırken boş bir nesne dizesi yazdırır toSource
. Ve yukarıdaki işlevi kullanırken, FF kilitlenir SecurityError: The operation is insecure.
. Ve Chrome kilitlenecek Uncaught RangeError: Maximum call stack size exceeded
. Açıkçası, document.body
dizeye dönüştürülmek istememişti. Çünkü ya çok büyük, ya da belirli özelliklere erişmek için güvenlik politikasına aykırı. Burada bir şey batırmadıkça, anlat!