어떤 이유로 든 중첩 된 개체에 대해 허용 된 답변이 작동하지 않습니다. 이로 인해 내 자신의 코드를 작성하게되었습니다. 이 글을 쓰는 2019 년 말이 되었기 때문에 언어 내에서 사용할 수있는 옵션이 몇 가지 더 있습니다.
업데이트 : 나는 David Furlong의 대답 이 나의 이전 시도에 대한 바람직한 접근 방식 이라고 믿습니다 . Mine은 Object.entries (...) 지원에 의존하므로 Internet Explorer를 지원하지 않습니다.
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);
-
역사적 참조를 위해이 이전 버전 유지
객체에있는 모든 키의 단순하고 평평한 배열이 작동한다는 것을 알았습니다. 거의 모든 브라우저 (예상대로 Edge 또는 Internet Explorer가 아님) 및 Node 12+에는 Array.prototype.flatMap (...) 을 사용할 수 있는 매우 짧은 솔루션 이 있습니다. (lodash 등가물도 작동합니다.) Safari, Chrome 및 Firefox에서만 테스트했지만 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
}
}
이전 JavaScript 엔진과 호환되어야하는 경우 flatMap 동작을 에뮬레이트하는 약간 더 자세한 버전을 사용할 수 있습니다. 클라이언트는 최소한 ES5를 지원해야하므로 Internet Explorer 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);
}