Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么对象会给出;未捕获类型错误:将循环结构转换为JSON;_Javascript_Json_Circular Reference - Fatal编程技术网

Javascript 为什么对象会给出;未捕获类型错误:将循环结构转换为JSON;

Javascript 为什么对象会给出;未捕获类型错误:将循环结构转换为JSON;,javascript,json,circular-reference,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] 无法找出产生此错误的原因。。任何帮助???对象的属性之一包含对对象本身的引用(或对其中一

这是我的对象和示例数据

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]

无法找出产生此错误的原因。。任何帮助???

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

您可以使用
dojox.JSON.ref
查找循环引用。此代码使用循环引用打印
对象的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>
在Chrome控制台中:

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

这是圆形参考探测器:

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')

我们需要知道其他对象中对对象的所有引用。您有一个循环引用(可能是THREE.Object3D->THREE.Object3D ref)@非常感谢您的回答。是,它在应用JSON.stringify时出错。我怎么才能弄明白呢?我使用了自定义替换程序,但它对我不起作用。这会在每个空字段上标记“检测到循环引用”。你测试过这个吗?
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')