(Cela a été ajouté à ma bibliothèque sur GitHub )
Réinventer la roue ici! Aucune de ces solutions n'a fonctionné pour ma situation. J'ai donc rapidement trafiqué la réponse de Wilsonpage . Celui-ci n'est pas destiné à l'impression sur écran (via la console, le champ de texte ou autre). Cela fonctionne bien dans ces situations et fonctionne très bien comme l'OP l'a demandé alert
. De nombreuses réponses ici ne traitent pas de l'utilisation alert
comme l'OP l'a demandé. Quoi qu'il en soit, il est cependant formaté pour le transport de données. Cette version semble renvoyer un résultat très similaire à toSource()
. Je n'ai pas testé contre JSON.stringify
, mais je suppose que c'est à peu près la même chose. Cette version ressemble plus à un poly-fil afin que vous puissiez l'utiliser dans n'importe quel environnement. Le résultat de cette fonction est une déclaration d'objet Javascript valide.
Je ne douterais pas si quelque chose comme ça était déjà sur SO quelque part, mais c'était juste plus court à faire que de passer un peu de temps à chercher les réponses passées. Et puisque cette question a été mon principal succès sur Google lorsque j'ai commencé à chercher à ce sujet; Je pensais que le mettre ici pourrait aider les autres.
Quoi qu'il en soit, le résultat de cette fonction sera une représentation sous forme de chaîne de votre objet, même si votre objet a des objets et des tableaux intégrés, et même si ces objets ou tableaux ont encore d'autres objets et tableaux intégrés. (Je vous ai entendu aimer boire? Alors, j'ai pimpé votre voiture avec une glacière. Et puis, j'ai pimpé votre glacière avec une glacière. Donc, votre glacière peut boire pendant que vous êtes cool.)
Les tableaux sont stockés avec []
au lieu de {}
et n'ont donc pas de paires clé / valeur, juste des valeurs. Comme des tableaux réguliers. Par conséquent, ils sont créés comme le font les tableaux.
De plus, toutes les chaînes (y compris les noms de clés) sont citées, ce n'est pas nécessaire à moins que ces chaînes aient des caractères spéciaux (comme un espace ou une barre oblique). Mais, je n'avais pas envie de détecter cela juste pour supprimer des citations qui, sinon, fonctionneraient toujours bien.
Cette chaîne résultante peut ensuite être utilisée avec eval
ou simplement la vider dans une manipulation de chaîne à travers. Ainsi, recréez à nouveau votre objet, à partir du texte.
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)+"]";
}
Faites-moi savoir si j'ai tout gâché, fonctionne bien dans mes tests. De plus, la seule façon dont je pouvais penser pour détecter le type array
était de vérifier la présence de length
. Parce que Javascript stocke vraiment les tableaux en tant qu'objets, je ne peux pas vérifier le type array
(il n'y en a pas!). Si quelqu'un d'autre connaît une meilleure façon, j'aimerais l'entendre. Parce que, si votre objet a également une propriété nommée, length
cette fonction le traitera par erreur comme un tableau.
EDIT: Ajout d'une vérification pour les objets de valeur nulle. Merci Brock Adams
EDIT: Ci-dessous est la fonction fixe pour pouvoir imprimer des objets infiniment récursifs. Cela n'imprime pas la même chose qu'à toSource
partir de FF car toSource
imprimera une fois la récursion infinie, où as, cette fonction la tuera immédiatement. Cette fonction s'exécute plus lentement que celle ci-dessus, donc je l'ajoute ici au lieu de modifier la fonction ci-dessus, car elle n'est nécessaire que si vous prévoyez de passer des objets qui se lient à eux-mêmes, quelque part.
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)+"]";
}
Tester:
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());
Résultat:
{'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}})
REMARQUE: Essayer d'imprimer document.body
est un exemple terrible. D'une part, FF imprime simplement une chaîne d'objet vide lors de l'utilisation toSource
. Et lorsque vous utilisez la fonction ci-dessus, FF se bloque SecurityError: The operation is insecure.
. Et Chrome va planter Uncaught RangeError: Maximum call stack size exceeded
. De toute évidence, document.body
n'était pas destiné à être converti en chaîne. Parce que c'est soit trop grand, soit contre la politique de sécurité pour accéder à certaines propriétés. Sauf si j'ai foiré quelque chose ici, dites-le!