JSON.stringify determinístico ()

Usar objetos JavaScript como mapas genéricos pode ser difícil, especialmente se você quiser usar objetos como chaves, porque as chaves do mapa precisam ser (ou são convertidas em) strings. Os objetos podem ser convertidos em strings usando JSON.stringify (), mas a ordem das chaves não é garantida aqui, o que significa que os mesmos objetos (ou equivalentes) podem resultar em strings diferentes.

Essas funções fornecem uma maneira de serializar e desserializar objetos deterministicamente, convertendo-os em pares de valor-chave, classificando esses pares por chave e, em seguida, passando-os por JSON.stringify (). Este código requer Underscore.js .

Stringify:

function stringify(obj) {
function flatten(obj) {
if (_.isObject(obj)) {
return _.sortBy(_.map(
_
.pairs(obj),
function(p) { return [p[0], flatten(p[1])]; }
),
function(p) { return p[0]; }
);
}
return obj;
}
return JSON.stringify(flatten(obj));
}

Analisar:

function parse(str) {
function inflate(obj, pairs) {
_
.each(pairs, function(p) {
obj
[p[0]] = _.isArray(p[1]) ?
inflate
({}, p[1]) :
p
[1];
});
return obj;
}
return inflate({}, JSON.parse(str));
}