我正在使用JavaScript编写编译器,对于优化器,我遵循通常的模式,其中重复运行优化列表,直到没有任何反应。检测“没有发生”条件的显而易见的方法是,如果成功执行某些操作,则为每个优化设置标记。我想知道是否有更优雅的方式去做。
在摘要中,问题可以这样表达:给定一个复杂的对象(包含许多级别的子对象,包括带有循环引用的数组等),通过可能的转换运行它然后检测是否有任何改变。所以问题是是否有一种简单的方法来检测复杂对象的变化。
Watch.js提供了检测对象变化的方法,但仅限于顶层,如果字段发生变化,即使它随后返回到原始值,也会触发。
另一种方法是制作对象的深层副本,然后与原始对象进行深度比较。然而,从这里的其他问题来看,深层复制看起来像一个非常重要的操作,深度比较本身就是挑战。
我是否缺少一个优雅的技巧,或者我是否应该坚持让每个优化过程都做自己的记账?
答案 0 :(得分:1)
我会发布此评论作为评论,但我没有所需的代表。
我不知道这是否适用于您的情况,但您可以做的是转换为JSON,然后比较字符串:
JSON.stringify(firstObject) === JSON.stringify(secondObject)
环顾四周,找到了另一个类似问题的stackoverflow帖子。有一个类似于我的解决方案,但我发现最有趣的是第二个解决方案,未选择作为答案,我认为它符合您的需求:Object comparison in JavaScript