Pour l'avenir, les googlers la recherche d'une solution à ce problème lorsque vous n'avez pas maintenant les clés de toutes les références circulaires, vous pouvez utiliser un wrapper autour du JSON.stringify fonction d'écarter les références circulaires. Voir un exemple de script à https://gist.github.com/4653128.
La solution se résume essentiellement à garder une référence précédemment imprimés objets dans un tableau, et en vérifiant que dans une fonction replacer avant de retourner une valeur. C'est plus contraignant que de seulement écarter les références circulaires, car il exclut aussi jamais l'impression d'un objet deux fois, l'un des effets secondaires de ce qui est à éviter les références circulaires.
Exemple wrapper:
function stringifyOnce(obj, replacer, indent){
var printedObjects = [];
var printedObjectKeys = [];
function printOnceReplacer(key, value){
var printedObjIndex = false;
printedObjects.forEach(function(obj, index){
if(obj===value){
printedObjIndex = index;
}
});
if(printedObjIndex && typeof(value)=="object"){
return "(see " + value.constructor.name.toLowerCase() + " with key " + printedObjectKeys[printedObjIndex] + ")";
}else{
var qualifiedKey = key || "(empty key)";
printedObjects.push(value);
printedObjectKeys.push(qualifiedKey);
if(replacer){
return replacer(key, value);
}else{
return value;
}
}
}
return JSON.stringify(obj, printOnceReplacer, indent);
}