【问题标题】:Detecting changes in a complex object检测复杂对象的变化
【发布时间】:2014-01-03 18:31:52
【问题描述】:

我正在用 JavaScript 编写编译器,而对于优化器,我遵循通常的模式,即重复运行优化列表直到没有任何反应。检测“什么都没有发生”情况的明显方法是让每个优化设置一个标志,如果它成功地做某事。我想知道是否有更优雅的方式来解决它。

在摘要中,问题可以这样表述:给定一个复杂对象(具有许多级别的子对象,包括具有循环引用的数组等),通过可能的转换运行它,然后检测是否有任何变化。所以问题是是否有一种简单的方法来检测复杂对象的变化。

Watch.js 提供了检测对象变化的方法,但仅限于顶层,并且会在字段发生变化时触发,即使该字段随后返回其原始值。

另一种方法是制作对象的深层副本,然后与原始对象进行深层比较。但是,从这里的其他问题来看,深度复制看起来是一项不平凡的操作,深度比较也有其自身的挑战。

我是否缺少一个优雅的技巧,或者我应该坚持让每个优化通过做自己的记账?

【问题讨论】:

  • Backbone.js 有这个内置的。 backbonejs.org/#Model-changedAttributes
  • @Diodeus 有趣!我从文档中得到的印象是它只看到顶级属性更改,但没有子对象的更改?
  • 头脑风暴:无论您使用什么来检测顶层的变化,您不能简单地将其应用于原始对象中的每个数组和子对象吗?
  • 你看过Object.observe吗?不过现在它在旗帜后面。

标签: javascript deep-copy


【解决方案1】:

我只是将其作为评论发布,但我没有所需的代表。

我不知道这是否适用于您的情况,但您可以做的是转换为 JSON,然后比较字符串:

JSON.stringify(firstObject) === JSON.stringify(secondObject) 

环顾四周,发现另一个有类似问题的 stackoverflow 帖子。有一个类似于我的解决方案,但我发现最有趣的是第二种解决方案,没有选择作为答案,我认为它有你需要的:Object comparison in JavaScript

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2011-03-27
    • 2021-03-30
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多