下划线是相等的和 JSON

underscore isEqual and JSON

本文关键字:JSON 下划线      更新时间:2023-09-26

我有一个问题,使用下划线isEqual来比较两个JSON字符串。目前我已经在 backbone 中做了一个应用程序,我正在使用 _.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();
}

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

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

嗨,

这个深度等于实现是为了解决类似的问题,但我可能错过了一些更精细的细节,它很好地满足了我的目的。

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