Javascript+;AngularJS-比较JSON
我有一个页面,其中有(定义良好的)输入数量,用户可以在其中输入数据(即文本框、选择等) 每当用户填充数据并单击“保存”按钮时,在实际保存过程开始之前,都需要进行大量操作和检查 现在(问题就在这里),每当用户单击“X”按钮关闭页面时,我都想检查数据库是否有任何更改(如果有,则提示确认) 我使用完整的输入列表生成两个对象:Javascript+;AngularJS-比较JSON,javascript,angularjs,json,Javascript,Angularjs,Json,我有一个页面,其中有(定义良好的)输入数量,用户可以在其中输入数据(即文本框、选择等) 每当用户填充数据并单击“保存”按钮时,在实际保存过程开始之前,都需要进行大量操作和检查 现在(问题就在这里),每当用户单击“X”按钮关闭页面时,我都想检查数据库是否有任何更改(如果有,则提示确认) 我使用完整的输入列表生成两个对象: 初始值对象,在呈现给用户之前保存整个值列表(@scope.Base_object),以及 使用ng model(@scope.Work\u Object)映射到输入的整个输入列表
@scope.Base_object
),以及ng model
(@scope.Work\u Object
)映射到输入的整个输入列表JSON.stringify(@scope.Base\u Object)
与JSON.stringify(@scope.Work\u Object)
进行比较,可以告诉我是否有任何更改
这种方法足够可靠吗
这种方法足够可靠吗
仅当对象的创建方式可靠地将属性以相同的顺序添加到对象中时(或者在对象上定义自己的toJSON
)。遵循ES2015中的定义,它对属性的创建顺序很敏感,因此两个等效对象可以具有不同的JSON表示,因为属性顺序可能不同:
VarO1={a:1,b:2};//在'b'之前添加'a'`
VarO2={b:2,a:1};//在'a'之前添加'b'`
var json1=JSON.stringify(o1);
var json2=JSON.stringify(o2);
console.log(json1);
log(json2);
console.log(json1==json2);//false感谢T.J.的回复。我构建这两个对象的方式是:(1)使用所有字段及其初始值构建基本对象,然后(2)将工作对象构建为
@scope.WORK\u object=JSON.parse(JSON.stringify(@scope.BASE\u object))
。根据你的回答,我相信我的问题的答案是“是的”,不是吗?@FDavidov:鉴于此,我无法立即思考为什么它会不可靠,但FWIW我仍然不会这么做。再次强调,深度相等性检查很容易,即使创建对象的代码随着时间的推移不可避免地被修改,它也会继续工作。好的,明白了(并标记了您的答案)。尽管如此,由于未来的任何更改都只会对基础对象(工作对象从中派生)进行,因此我对这个替代方案感到满意。非常感谢@弗达维多夫:这完全是你的决定。:-)我知道。。。尽管如此,有时你还是得凭直觉;-)