Kabul edilen yanıt, bazı nedenlerden dolayı iç içe geçmiş nesneler için benim için çalışmıyor. Bu benim kendi kodumu yazmamı sağladı. Bunu yazdığım 2019'un sonları olduğu için, dilde birkaç seçenek daha var.
Güncelleme: David Furlong'un cevabının daha önceki girişimime tercih edilen bir yaklaşım olduğuna inanıyorum ve bunu yarıda bıraktım. Benimki Object.entries (...) desteğine dayanıyor, dolayısıyla Internet Explorer desteği yok.
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);
-
BU ESKİ SÜRÜMÜ TARİHSEL REFERANS İÇİN SAKLAMAK
Nesnedeki tüm anahtarların basit, düz bir dizisinin çalışacağını buldum. Neredeyse tüm tarayıcılarda (tahmin edilebileceği gibi Edge veya Internet explorer değil) ve Node 12+ Array.prototype.flatMap (...) kullanılabilir olduğu için oldukça kısa bir çözüm var. (Lodash eşdeğeri de işe yarar.) Yalnızca Safari, Chrome ve Firefox'ta test ettim, ancak flatMap ve standart JSON.stringify (...) destekleyen başka hiçbir yerde çalışmaması için hiçbir neden göremiyorum .
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);
}
Bununla, üçüncü taraf bağımlılıkları olmadan dizgi oluşturabilir ve hatta anahtar-değer giriş çiftlerini sıralayan kendi sıralama algoritmanızı iletebilirsiniz, böylece anahtara, yüke veya ikisinin bir kombinasyonuna göre sıralayabilirsiniz. Yuvalanmış nesneler, diziler ve düz eski veri türlerinin herhangi bir karışımı için çalışır.
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));
Baskılar:
{
"a": 2,
"b": 1,
"c": {
"x": 3,
"y": [
2048,
1999,
{
"f": 5,
"g": "help",
"x": false
}
],
"z": 4
}
}
Eski JavaScript motorlarıyla uyumluluğunuz olması gerekiyorsa flatMap davranışını taklit eden bu biraz daha ayrıntılı sürümleri kullanabilirsiniz. İstemci en az ES5'i desteklemelidir, bu nedenle Internet Explorer 8 veya altını desteklemez.
Bunlar, yukarıdakiyle aynı sonucu verecektir.
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);
}