গৃহীত উত্তরটি কোনও কারণে নেস্টেড অবজেক্টের জন্য কাজ করে না। এটি আমাকে নিজের কোড আপ করতে পরিচালিত করেছে। যেহেতু 2019 এর শেষের দিকে, যখন আমি এটি লিখব, ভাষার মধ্যে আরও কয়েকটি বিকল্প উপলব্ধ।
আপডেট: আমি বিশ্বাস করি যে ডেভিড ফারলংয়ের উত্তর আমার আগের প্রয়াসের পক্ষে একটি অগ্রাধিকারযোগ্য পদ্ধতি এবং আমি এটিকে অগ্রাহ্য করেছি। খনি অবজেক্ট.এন্ট্রি (...) এর সমর্থনের উপর নির্ভর করে, তাই কোনও ইন্টারনেট এক্সপ্লোরার সমর্থন করে না।
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);
-
REতিহাসিক রেফারেন্সের জন্য এই পুরাতন সংস্করণটি রাখা
আমি দেখতে পেয়েছি যে অবজেক্টের সমস্ত কীগুলির একটি সহজ, সমতল অ্যারে কাজ করবে। প্রায় সমস্ত ব্রাউজারগুলিতে (এজ বা ইন্টারনেট এক্সপ্লোরার নয়, সম্ভবত) এবং নোড 12+ এ একটি মোটামুটি সংক্ষিপ্ত সমাধান রয়েছে যে অ্যারে.প্রোটোটাইপ.ফ্ল্যাটম্যাপ (...) উপলব্ধ। (লোডাশের সমতুল্যও কাজ করবে)) আমি কেবল সাফারি, ক্রোম এবং ফায়ারফক্সে পরীক্ষা করেছি, তবে ফ্ল্যাটম্যাপ এবং মানক 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);
}