我正在制作游戏,但遇到了问题...当我尝试保存时,JSON 失败并报告在某处进行了循环引用。我不认为它实际上是,我看不到它,所以有没有算法或任何东西可以告诉我它到底在哪里(在哪些对象和东西之间)?另外,是否有可以保存循环引用的 JSON 替代方案?我正在运行一个 node.js 服务器,我看到了 this ,但我无法让它工作(它不是作为我可以在我的代码中 require() 的模块)。
最佳答案
如果要序列化循环引用以便保存它,则需要将引用设置为“虚拟”,因为它不能作为循环引用序列化,因为这会导致序列化序列化同一个循环永远的对象(或至少在运行时内存耗尽之前)。
因此,您只需存储指向对象的指针,而不是存储循环引用本身。指针就像 ref : '#path.to.object'
之类的东西,可以在您反序列化时解析,因此您将引用指向实际对象。您只需要打破对序列化的引用即可对其进行序列化。
在 JavaScript 中发现循环引用可以通过递归遍历所有对象(使用 for (x in y)
),将 x
存储在数组中并比较每个对象来完成x
与身份运算符(又名 strict comparison operator)===
用于临时数组中的每个 z
。每当 x === z
等于 true 时,将对 x
的引用替换为将被序列化为上述 ref
的占位符。
将数组保留在“已访问”对象上的另一种方法是通过在对象上设置属性来“污染”您迭代的对象,就像在这个非常幼稚的示例中一样:
for (x in y) {
if (x.visited) {
continue;
}
x.visited = true;
}
关于javascript - 有没有办法在 JavaScript 中测试循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7582001/