javascript - 有没有办法在 JavaScript 中测试循环引用?

标签 javascript json node.js serverside-javascript circular-reference

我正在制作游戏,但遇到了问题...当我尝试保存时,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/

相关文章:

javascript - 如何在 1 个函数中多次调用语音识别?

javascript - 恢复后phonegap setinterval继续

javascript - 生成 JSON - 如何提高性能

javascript - 循环 JSON 并在满足条件时停止。然后数一下物体的数量

javascript - 附加到路径的正确方法是什么?

javascript - JavaScript 可以读取 HTTP Session 对象吗?

javascript - 添加到一个间隔中被读取/删除的数组

json - 雅典娜 : use only a subset of JSON fields

javascript - 在JavaScript中寻找凯撒的密码脚本,我可以进行修改以允许所有(可键入的)ASCII字符

mysql - Sails 不创建 mysql 表