Die akzeptierte Antwort funktioniert bei mir für verschachtelte Objekte aus irgendeinem Grund nicht. Dies führte mich dazu, meine eigenen zu codieren. Da es Ende 2019 ist, als ich dies schreibe, gibt es einige weitere Optionen in der Sprache.
Update: Ich glaube, die Antwort von David Furlong ist ein bevorzugter Ansatz für meinen früheren Versuch, und das habe ich abgehört. Meins ist auf die Unterstützung von Object.entries (...) angewiesen, daher keine Internet Explorer-Unterstützung.
function normalize(sortingFunction) {
return function(key, value) {
if (typeof value === 'object' && !Array.isArray(value)) {
return Object
.entries(value)
.sort(sortingFunction || undefined)
.reduce((acc, entry) => {
acc[entry[0]] = entry[1];
return acc;
}, {});
}
return value;
}
}
JSON.stringify(obj, normalize(), 2);
- -
BEHALTEN SIE DIESE ÄLTERE VERSION FÜR HISTORISCHE REFERENZEN
Ich habe festgestellt, dass eine einfache, flache Anordnung aller Schlüssel im Objekt funktioniert. In fast allen Browsern (vorhersehbar nicht Edge oder Internet Explorer) und Node 12+ gibt es jetzt, da Array.prototype.flatMap (...) verfügbar ist, eine ziemlich kurze Lösung . (Das lodash-Äquivalent würde auch funktionieren.) Ich habe nur in Safari, Chrome und Firefox getestet, aber ich sehe keinen Grund, warum es nirgendwo anders funktionieren würde, das flatMap und Standard JSON.stringify (...) unterstützt .
function flattenEntries([key, value]) {
return (typeof value !== 'object')
? [ [ key, value ] ]
: [ [ key, value ], ...Object.entries(value).flatMap(flattenEntries) ];
}
function sortedStringify(obj, sorter, indent = 2) {
const allEntries = Object.entries(obj).flatMap(flattenEntries);
const sorted = allEntries.sort(sorter || undefined).map(entry => entry[0]);
return JSON.stringify(obj, sorted, indent);
}
Auf diese Weise können Sie ohne Abhängigkeiten von Drittanbietern eine Zeichenfolge erstellen und sogar Ihren eigenen Sortieralgorithmus übergeben, der die Schlüssel-Wert-Eintragspaare sortiert, sodass Sie nach Schlüssel, Nutzlast oder einer Kombination aus beiden sortieren können. Funktioniert für verschachtelte Objekte, Arrays und jede Mischung aus einfachen alten Datentypen.
const obj = {
"c": {
"z": 4,
"x": 3,
"y": [
2048,
1999,
{
"x": false,
"g": "help",
"f": 5
}
]
},
"a": 2,
"b": 1
};
console.log(sortedStringify(obj, null, 2));
Drucke:
{
"a": 2,
"b": 1,
"c": {
"x": 3,
"y": [
2048,
1999,
{
"f": 5,
"g": "help",
"x": false
}
],
"z": 4
}
}
Wenn Sie mit älteren JavaScript-Engines kompatibel sein müssen , können Sie diese etwas ausführlicheren Versionen verwenden, die das flatMap-Verhalten emulieren. Der Client muss mindestens ES5 unterstützen, daher kein Internet Explorer 8 oder niedriger.
Diese geben das gleiche Ergebnis wie oben zurück.
function flattenEntries([key, value]) {
if (typeof value !== 'object') {
return [ [ key, value ] ];
}
const nestedEntries = Object
.entries(value)
.map(flattenEntries)
.reduce((acc, arr) => acc.concat(arr), []);
nestedEntries.unshift([ key, value ]);
return nestedEntries;
}
function sortedStringify(obj, sorter, indent = 2) {
const sortedKeys = Object
.entries(obj)
.map(flattenEntries)
.reduce((acc, arr) => acc.concat(arr), [])
.sort(sorter || undefined)
.map(entry => entry[0]);
return JSON.stringify(obj, sortedKeys, indent);
}