json.stringify() 可以将对象转换成json格式的字符串。 js的对象是树形结构的 当这个对象存在闭环时,json.stringify()会抛出一个错误。
“环”的形成是因为对象中子属性中赋值了父属性的引用,所以我们需要记录下父属性的地址与子节点属性进行比较,若一样则形成了闭环,若不同则没有
var obj = {
foo: {
name: 'foo',
bar: {
name: 'bar',
baz: {
name: 'baz',
child: null //后面将指向obj.foo
}
}
}
}
obj.foo.bar.baz.child = obj.foo //foo->bar->baz->child->foo 形成闭环
// JSON.stringify(obj)
function circleDelect(obj) {
let flag = false; // 判断是否有环
let cache = [];
(function (obj) {
let keys = Object.keys(obj);
for(let i = 0; i < keys.length; i++) {
var key = keys[i];
var value = obj[key];
if (typeof value === 'object' && value !== null) {
var index = cache.indexOf(value)
if(index !== -1) {
flag = true;
break
} else {
cache.push(value)
arguments.callee(value) //指向当前函数的引用
cache.pop();
}
}
}
})(obj)
return flag;
}
console.log(circleDelect(obj))
参考https://www.jianshu.com/p/a2bb29aa4fce