Ich habe keine einfache Methode gefunden, um es zu tun, andere Leute scheinen vorzuschlagen mit benutzerdefinierten Replacer-Funktion in JSON.Stringify zu steuern, welche Eigenschaften besucht wurden.
ich versucht habe solche replacer zu schreiben:
function detector(obj) {
function collector (stack, key, val) {
var idx = stack[stack.length - 1].indexOf(key);
try {
var props = Object.keys(val);
if (!props.length) throw props;
props.unshift({idx : idx});
stack.push(props);
} catch (e) {
while (!(stack[stack.length - 1].length - 2)) {
idx = stack[stack.length -1][0].idx;
stack.pop();
}
if (idx + 1) {
stack[stack.length - 1].splice(idx, 1);
}
}
return val;
}
var stack = [[]];
try {
JSON.stringify(obj, collector.bind(null, stack));
} catch (e) {
if (e.message.indexOf('circular') !== -1) {
var idx = 0;
var path = '';
var parentProp = '';
while(idx + 1) {
idx = stack.pop()[0].idx;
parentProp = stack[stack.length - 1][idx];
if (!parentProp) break;
path = '.' + parentProp + path;
}
console.log(path);
}
}
}
Was sie tut, ist, während der Baum JSON durchqueren (wahrscheinlich Baum :)) es Namen von Eigenschaften sammelt, die so bald wie JSON besucht wurden. stringify erkennt Kreisreferenz und Würfe, die Variable 'stack' enthält eine Spur, welche Teilbäume sie gerade durchquert. Und es protokolliert diesen Pfad zur Konsole.
Dies ist jedoch keine stark getestete Lösung.
Wenn es nicht * zu * riesig ist, konntest du einfach 'console.dir()' das Objekt und dann interaktiv in der Browserkonsole herumstochern. – Pointy