Merge pull request #745 from Juris-M/simpler-stable-stringify

Simplification of stableStringify()
This commit is contained in:
Dan Stillman 2015-05-31 17:10:42 -04:00
commit 8ff108cbdf

View File

@ -202,39 +202,18 @@ function resetDB() {
* Equivalent to JSON.stringify, except that object properties are stringified * Equivalent to JSON.stringify, except that object properties are stringified
* in a sorted order. * in a sorted order.
*/ */
function stableStringify(obj, level, label) { function stableStringify(obj) {
if (!level) level = 0; return JSON.stringify(obj, function(k, v) {
let indent = '\t'.repeat(level); if (v && typeof v == "object" && !Array.isArray(v)) {
let o = {},
if (label) label = JSON.stringify('' + label) + ': '; keys = Object.keys(v).sort();
else label = ''; for (let i = 0; i < keys.length; i++) {
o[keys[i]] = v[keys[i]];
if (typeof obj == 'function' || obj === undefined) return null; }
return o;
if (typeof obj != 'object' || obj === null) return indent + label + JSON.stringify(obj);
if (Array.isArray(obj)) {
let str = indent + label + '[';
for (let i=0; i<obj.length; i++) {
let json = stableStringify(obj[i], level + 1);
if (json === null) json = indent + '\tnull'; // function
str += '\n' + json + (i < obj.length-1 ? ',' : '');
} }
return str + (obj.length ? '\n' + indent : '') + ']'; return v;
} }, "\t");
let keys = Object.keys(obj).sort(),
empty = true,
str = indent + label + '{';
for (let i=0; i<keys.length; i++) {
let json = stableStringify(obj[keys[i]], level + 1, keys[i]);
if (json === null) continue; // function
empty = false;
str += '\n' + json + (i < keys.length-1 ? ',' : '');
}
return str + (!empty ? '\n' + indent : '') + '}';
} }
/** /**