【问题标题】:underscore isEqual and JSON下划线 isEqual 和 JSON
【发布时间】:2013-10-11 10:34:52
【问题描述】:

我有一个使用下划线 isEqual 比较两个 JSON 字符串的问题。目前我已经在主干中完成了一个应用程序,我正在使用 _.isEqual(savedModel.toJSON(),changedModel.toJSON() ) 来检测页面中的模型是否已更改并提示“您有未保存的更改,请执行你要救吗?”如果用户厌倦了导航,则对话框。

出于某种原因,即使我什么也没做或保存了更改,我也会在随机的地方得到对话框。调试快把我逼疯了。

这可能是因为 JSON 不保证 JSON 中对象的顺序并且下划线 isEqual 不能正确处理这种情况吗?所以即使模型相同,JSON中的某些属性也可能不同,返回false?

伪代码:

//when entering the page the original model is cloned, when user does changes to the   
//page, the model is cloned again
var savedModel = currentModel.clone().toJSON();

//when the user tries to navigate away from the page
if( _.isEqual(savedModel, model.toJSON() ){
    showSavePromptDialog();
}

【问题讨论】:

标签: javascript json backbone.js underscore.js


【解决方案1】:

按照backbone.toJSON() 使用的函数链,似乎_.extend 用于复制对象,_.extend 使用for..in 循环来迭代对象。 for..in 以任意顺序迭代对象,这可能是问题的根源。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

【讨论】:

  • 是的,不知道,但是 _.isEqual 应该是深度比较,实际上 toJSON 返回的对象是一个数组,而不是字符串,所以顺序不重要,如果 isEqual没有正确实施。
  • 我同意 Underscore.js 1.6.0 isEqual() 仍然被破坏,我浪费了很多时间试图自己解决这个问题。
【解决方案2】:

嗨,这个 deep equals 实现是为了解决类似的问题,但我可能错过了一些更精细的细节,它对我的​​目的很有效。

http://yui3.wordpress.com/2013/04/22/deep-compare-in-javascript/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多