当我在大型结构上得到Uncaught TypeError: Converting circular structure to JSON
时,很难找到圆形参考的确切位置。
有没有一种简单的方法可以在数据结构中查找/调试循环元素?
答案 0 :(得分:5)
我还没有找到一个简单的方法,其他人似乎建议在JSON.stringify中使用自定义替换函数来控制访问过哪些属性。
我试图写这样的替换者:
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);
}
}
}
它的作用是在遍历JSON树(可能是树:)时收集已经访问过的属性的名称,一旦JSON.stringify检测到循环引用和抛出,'stack'变量将包含其中的一个跟踪子树它正在穿越。它将此路径记录到控制台。
但是,这不是经过严格测试的解决方案。