Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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.stringify时出错_Javascript_Json_Firefox Addon_Circular Dependency - Fatal编程技术网

Javascript &引用;“递归太多”;在具有循环依赖项的大型对象上调用JSON.stringify时出错

Javascript &引用;“递归太多”;在具有循环依赖项的大型对象上调用JSON.stringify时出错,javascript,json,firefox-addon,circular-dependency,Javascript,Json,Firefox Addon,Circular Dependency,我有一个包含循环引用的对象,我想看看它的JSON表示。例如,如果我构建此对象: var myObject = {member:{}}; myObject.member.child = {}; myObject.member.child.parent = myObject.member; 试着打电话 JSON.stringify(myObject); 我得到了错误“太多递归”,这并不奇怪。“子”对象引用其“父”对象,父对象引用其子对象。JSON表示并不一定要完全准确,因为我只是将其用于调试,而

我有一个包含循环引用的对象,我想看看它的JSON表示。例如,如果我构建此对象:

var myObject = {member:{}};
myObject.member.child = {};
myObject.member.child.parent = myObject.member;
试着打电话

JSON.stringify(myObject);
我得到了错误“太多递归”,这并不奇怪。“子”对象引用其“父”对象,父对象引用其子对象。JSON表示并不一定要完全准确,因为我只是将其用于调试,而不是将数据发送到服务器或将对象序列化为文件或诸如此类的内容。有没有办法告诉JSON.stringify忽略某些属性(在本例中是子对象的
parent
属性),这样我就可以得到:

{
    "member" : {
        "child" : {}
    }
}

我能想到的最接近的方法是使用
getChild()
getParent()
方法,而不仅仅是成员,因为JSON.stringify会忽略任何属于函数的属性,但如果不需要的话,我宁愿不这样做。

您可以将函数作为第二个参数传递给stringify。 此函数接收要字符串化的成员的键和值作为参数。 如果此函数返回undefined,则将忽略该成员

alert(JSON.stringify(myObject, function(k, v) {
    return (k === 'member') ? undefined : v;
}));
…或使用例如firebug或使用toSource()-方法,如果您只想查看对象内部的内容

alert(myObject.toSource());
(详情如下):

如果stringify方法看到一个包含toJSON方法的对象,它将调用该方法,并对返回的值进行stringify。这允许对象确定自己的JSON表示

那么像这样的东西应该可以很好地工作:

var myObject =
{
    member: { child: {} }
}
myObject.member.child.parent = myObject.member;
myObject.member.child.toJSON = function ()
{
    return 'no more recursion for you.';
};

console.log(JSON.stringify(myObject));​

是一个非标准的、仅限于Firefox的功能。Object.toSource()是在Javascript 1.3中引入的,如果它在Firefox中工作,那么“查看”功能也不错,例如,对于调试,不管它是否是ECMAScript的一部分。提供的这两种方法仍然给了我“太多的递归”错误——可能还有一些我没有看到的奇怪的依赖关系。