下划线isEqual和JSON

时间:2013-10-11 10:34:53

标签: javascript json backbone.js underscore.js

我有一个问题,使用下划线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();
}

2 个答案:

答案 0 :(得分:1)

在backbone.toJSON()使用的函数链之后,看起来_.extend用于复制对象,而_.extend使用for..in循环来迭代对象。 for..in以任意顺序迭代一个对象,这可能是你问题的根源。

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

答案 1 :(得分:1)

嗨,这深刻等于实现解决类似问题的实现,但我可能错过了一些更精细的细节,它很适合我的目的。

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