(Dies wurde meiner Bibliothek bei GitHub hinzugefügt. )
Das Rad hier neu erfinden! Keine dieser Lösungen hat für meine Situation funktioniert. Also habe ich schnell die Antwort von wilsonpage überarbeitet . Dieser dient nicht zum Drucken auf dem Bildschirm (über die Konsole, das Textfeld oder was auch immer). In solchen Situationen funktioniert es einwandfrei und funktioniert einwandfrei, wie vom OP angefordert, z alert
. Viele Antworten hier beziehen sich nicht auf die Verwendung alert
als OP angefordert. Auf jeden Fall ist es jedoch für den Datentransport formatiert. Diese Version scheint ein sehr ähnliches Ergebnis zu liefern wie toSource()
. Ich habe nicht gegen getestet JSON.stringify
, aber ich gehe davon aus, dass dies ungefähr das Gleiche ist. Diese Version ähnelt eher einer Polydatei, sodass Sie sie in jeder Umgebung verwenden können. Das Ergebnis dieser Funktion ist eine gültige Javascript-Objektdeklaration.
Ich würde nicht bezweifeln, dass so etwas schon irgendwo auf SO war, aber es war nur kürzer, es zu schaffen, als eine Weile nach Antworten zu suchen. Und da diese Frage mein Top-Hit bei Google war, als ich anfing, danach zu suchen; Ich dachte, es hier zu platzieren könnte anderen helfen.
Das Ergebnis dieser Funktion ist jedoch eine Zeichenfolgendarstellung Ihres Objekts, selbst wenn Ihr Objekt eingebettete Objekte und Arrays enthält und selbst wenn diese Objekte oder Arrays noch weitere eingebettete Objekte und Arrays enthalten. (Ich habe gehört, dass du gerne trinkst? Also habe ich dein Auto mit einem Kühler gepimpt. Und dann habe ich deinen Kühler mit einem Kühler gepimpt. Also kann dein Kühler trinken, während du cool bist.)
Arrays werden mit []
statt gespeichert {}
und haben daher keine Schlüssel / Wert-Paare, sondern nur Werte. Wie normale Arrays. Daher werden sie wie Arrays erstellt.
Außerdem werden alle Zeichenfolgen (einschließlich Schlüsselnamen) in Anführungszeichen gesetzt. Dies ist nur erforderlich, wenn diese Zeichenfolgen Sonderzeichen enthalten (z. B. ein Leerzeichen oder einen Schrägstrich). Aber ich hatte keine Lust, dies zu entdecken, nur um einige Zitate zu entfernen, die sonst immer noch gut funktionieren würden.
Diese resultierende Zeichenfolge kann dann verwendet werden eval
oder einfach in eine Var-Through-Zeichenfolgenmanipulation ausgegeben werden. So erstellen Sie Ihr Objekt erneut aus Text.
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)+"]";
}
Lassen Sie mich wissen, wenn ich alles durcheinander gebracht habe, funktioniert gut in meinen Tests. Die einzige Möglichkeit, einen Typ zu erkennen, array
bestand darin, das Vorhandensein von zu überprüfen length
. Da Javascript Arrays wirklich als Objekte speichert, kann ich nicht nach Typ suchen array
(es gibt keinen solchen Typ!). Wenn jemand einen besseren Weg kennt, würde ich ihn gerne hören. Wenn Ihr Objekt auch eine Eigenschaft mit dem Namen length
hat, wird es von dieser Funktion fälschlicherweise als Array behandelt.
BEARBEITEN: Prüfung für Objekte mit Nullwert hinzugefügt. Danke Brock Adams
BEARBEITEN: Unten ist die feste Funktion, um unendlich rekursive Objekte drucken zu können. Dies wird nicht wie toSource
bei FF toSource
gedruckt, da die unendliche Rekursion einmal gedruckt wird, wobei diese Funktion sie sofort beendet. Diese Funktion läuft langsamer als die oben beschriebene, daher füge ich sie hier hinzu, anstatt die obige Funktion zu bearbeiten, da sie nur benötigt wird, wenn Sie Objekte übergeben möchten, die irgendwo wieder mit sich selbst verknüpft sind.
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)+"]";
}
Prüfung:
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());
Ergebnis:
{'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}})
HINWEIS: Der Versuch zu drucken document.body
ist ein schreckliches Beispiel. Zum einen druckt FF bei Verwendung nur eine leere Objektzeichenfolge toSource
. Und wenn Sie die obige Funktion verwenden, stürzt FF ab SecurityError: The operation is insecure.
. Und Chrome wird weiter abstürzen Uncaught RangeError: Maximum call stack size exceeded
. Es war klar, dass document.body
es nicht in einen String konvertiert werden sollte. Weil es entweder zu groß ist oder gegen Sicherheitsrichtlinien verstößt, um auf bestimmte Eigenschaften zuzugreifen. Es sei denn, ich habe hier oben etwas durcheinander gebracht, erzähl es doch!