首页 > 解决方案 > 当两个对象相互引用时,如何停止无限递归?

问题描述

假设我想制作一个对象的深层副本。我使用递归来遍历它的属性。现在这些属性之一可以是一个对象。例如:

Person A
  Name: "Fred"
  Best Friend: Person B

现在如果人 B 是:

Person B
  Name: "Max"
  Best Friend: Person A

这将创建一个无休止的递归。我怎样才能避免这种无休止的循环?

标签: javascriptjavarecursioncomputer-science

解决方案


您可以使用与JSON.stringify相同的逻辑来避免无限循环。

  1. 如果 state.[[Stack]] 包含 value,则抛出 TypeError 异常,因为该结构是循环的。

它保留一堆正在序列化的父对象。每次调用序列化新值的方法时,都会检查堆栈以查看该值是否已经在序列化过程中,如果是,则抛出错误。

对于您的示例,如果您要制作“人 A”的副本,则在考虑如何复制“最好的朋友”属性时,父堆栈将是 [人 A]。更深入地讲,当序列化 Person B 的“Best Friend”属性时,父堆栈将是 [Person A, Person B]。看到下一个要序列化的项目,人 B 的“Best Friend”值,人 A,已经在堆栈中,抛出错误。


推荐阅读