为什么对象给出“Uncaught TypeError:将循环结构转换为JSON”

时间:2013-05-17 20:08:05

标签: javascript json circular-reference

这是带有样本数据的对象

Object {map: Array[10], health: 100, ai: Array[4]}
ai: Array[4]
0: THREE.Object3D
1: THREE.Object3D
2: THREE.Object3D
3: THREE.Object3D
length: 4
__proto__: Array[0]
health: 100
map: Array[10]

无法找出导致此错误的原因..任何人都有帮助??

3 个答案:

答案 0 :(得分:0)

对象的一个​​属性包含对象本身的引用(或者,对其中一个子对象的递归引用)。虽然这很好用,但将对象转换为JSON会产生无限递归。

答案 1 :(得分:0)

您可以使用dojox.json.ref查找循环引用。此代码打印objectWithCircularReferences的json表示:

require(["dojox/json/ref"], function(){
    console.log(dojox.json.ref.toJson(ko.toJS(objectWithCircularReferences)));
});

在输出到控制台的任何“$ ref”子字符串出现都会帮助您找到循环引用。如果您愿意,也可以将此json输出管道传输到全局变量ZZZ:

require(["dojox/json/ref"], function(){
    window.ZZZ = dojox.json.ref.toJson(ko.toJS(objectWithCircularReferences));
});

当然,您需要事先包含dojo库。在html文件中:

<script src="//yandex.st/dojo/1.9.1/dojo/dojo.js"></script>

在firebug控制台中:

include("//yandex.st/dojo/1.9.1/dojo/dojo.js")

在Chrome控制台中:

SCRIPT = document.createElement('script');
SCRIPT.src = '//yandex.st/dojo/1.9.1/dojo/dojo.js';
document.body.appendChild(SCRIPT);

答案 2 :(得分:0)

这是检测到的循环引用:

o = {a: 1, b:2, c:{d:3, e:4}, q:[1,2,3,4,5,{f:6,g:7}]}
o.o = o
console.log(o)
var done = []
function circRefDetec(o, path) {
   done.push(o)
   for (i in o) if (typeof o[i] == 'object') {
      if (done.indexOf(o[i]) >= 0) {
         console.log('CIRCULAR REFERECE DETECTED:', path +'.'+ i)
      } else {
         console.log(i, ':')
         circRefDetec(o[i], path +' '+ i)
      }
   }
}
circRefDetec(o, 'obj')