स्वीकृत उत्तर किसी कारणवश नेस्टेड वस्तुओं के लिए मेरे लिए काम नहीं करता है। इसने मुझे अपना कोड अप करने के लिए प्रेरित किया। जैसा कि 2019 के अंत में जब मैं इसे लिखता हूं, तो भाषा के भीतर कुछ और विकल्प उपलब्ध होते हैं।
अद्यतन: मेरा मानना है कि डेविड फर्लांग का उत्तर मेरे पहले प्रयास के लिए एक बेहतर दृष्टिकोण है, और मैं इससे दूर हो गया हूं। मेरा उद्देश्य Object.entries (...) के लिए समर्थन पर निर्भर करता है, इसलिए कोई इंटरनेट एक्सप्लोरर समर्थन नहीं करता है।
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);
-
व्यावसायिक संदर्भ के लिए इस संस्करण का उपयोग करना
मैंने पाया कि ऑब्जेक्ट में सभी कुंजियों का एक सरल, सपाट सरणी काम करेगा। लगभग सभी ब्राउज़रों में (एज या इंटरनेट एक्सप्लोरर नहीं, अनुमानित रूप से) और नोड 12+ में अब काफी कम समाधान है कि Array.prototype.flatMap (...) उपलब्ध है। (लॉश समतुल्य भी काम करेगा।) मैंने केवल सफारी, क्रोम, और फ़ायरफ़ॉक्स में परीक्षण किया है, लेकिन मुझे कोई कारण नहीं दिखता है कि यह कहीं और काम नहीं करेगा जो फ्लैट मैप और मानक JSON.stringify (...) का समर्थन करता है ।
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);
}
इसके साथ, आप बिना किसी तृतीय-पक्ष निर्भरता के स्ट्रिंग कर सकते हैं और यहां तक कि कुंजी-मूल्य प्रविष्टि जोड़े पर सॉर्ट करने वाले अपने खुद के सॉर्ट एल्गोरिथ्म में पास कर सकते हैं, इसलिए आप कुंजी, पेलोड या दो के संयोजन से सॉर्ट कर सकते हैं। नेस्टेड ऑब्जेक्ट्स, सरणियों और सादे पुराने डेटा प्रकारों के किसी भी मिश्रण के लिए काम करता है।
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));
प्रिंटों:
{
"a": 2,
"b": 1,
"c": {
"x": 3,
"y": [
2048,
1999,
{
"f": 5,
"g": "help",
"x": false
}
],
"z": 4
}
}
यदि आपके पास पुराने जावास्क्रिप्ट इंजन के साथ संगतता होनी चाहिए , तो आप इन थोड़े अधिक वर्बोज़ संस्करणों का उपयोग कर सकते हैं जो फ्लैटपाइप व्यवहार का अनुकरण करते हैं। क्लाइंट को कम से कम ES5 का समर्थन करना चाहिए, इसलिए कोई इंटरनेट एक्सप्लोरर 8 या उससे नीचे नहीं।
ये ऊपर के समान परिणाम लौटाएंगे।
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);
}