我试图比较这两个JSON对象:
<input type="hidden" id="remoteJSON" name="remoteJSON" value='{"allowExternalMembers": "false", "whoCanJoin": "CAN_REQUEST_TO_JOIN"}' /><br />
<input type="hidden" id="localJSON" name="localJSON" value='{"whoCanJoin": "CAN_REQUEST_TO_JOIN", "allowExternalMembers": "false"}' /><br />
我使用javascript获取了值,我尝试与:JSON.stringify(remoteJSON) == JSON.stringify(localJSON)
进行比较,但这返回false:似乎属性的顺序很重要。
我甚至尝试与this solution进行深度比较并且总是得到错误的回报。
有没有一种快速的方法来解决jQuery的问题(即用于比较JSON的库)?
答案 0 :(得分:17)
Lodash _.isEqual
允许你这样做:
var
remoteJSON = {"allowExternalMembers": "false", "whoCanJoin": "CAN_REQUEST_TO_JOIN"},
localJSON = {"whoCanJoin": "CAN_REQUEST_TO_JOIN", "allowExternalMembers": "false"};
console.log( _.isEqual(remoteJSON, localJSON) );
&#13;
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
&#13;
答案 1 :(得分:2)
在javascript中比较两个json字符串的简便方法
var obj1 = {"name":"Sam","class":"MCA"};
var obj2 = {"class":"MCA","name":"Sam"};
var flag=true;
if(Object.keys(obj1).length==Object.keys(obj2).length){
for(key in obj1) {
if(obj1[key] == obj2[key]) {
continue;
}
else {
flag=false;
break;
}
}
}
else {
flag=false;
}
console.log("is object equal"+flag);
答案 2 :(得分:2)
我改编并修改了this tutorial中的代码,以编写一个对两个JS对象进行深度比较的函数。
const isEqual = function(obj1, obj2) {
const obj1Keys = Object.keys(obj1);
const obj2Keys = Object.keys(obj2);
if(obj1Keys.length !== obj2Keys.length) {
return false;
}
for (let objKey of obj1Keys) {
if (obj1[objKey] !== obj2[objKey]) {
if(typeof obj1[objKey] == "object" && typeof obj2[objKey] == "object") {
if(!isEqual(obj1[objKey], obj2[objKey])) {
return false;
}
}
else {
return false;
}
}
}
return true;
};
该功能比较两个对象的相同键的相应值。此外,如果两个值都是对象,它也会使用递归对它们执行深度比较。
希望这会有所帮助。
答案 3 :(得分:2)
DeepCompare方法,用于比较两个json对象。
deepCompare = (arg1, arg2) => {
if (Object.prototype.toString.call(arg1) === Object.prototype.toString.call(arg2)){
if (Object.prototype.toString.call(arg1) === '[object Object]' || Object.prototype.toString.call(arg1) === '[object Array]' ){
if (Object.keys(arg1).length !== Object.keys(arg2).length ){
return false;
}
return (Object.keys(arg1).every(function(key){
return deepCompare(arg1[key],arg2[key]);
}));
}
return (arg1===arg2);
}
return false;
}
console.log(deepCompare({a:1},{a:'1'})) // false
console.log(deepCompare({a:1},{a:1})) // true
答案 4 :(得分:2)
此代码将独立于 param 对象顺序验证 json。
{ uuid:"file uuid value", filepath:"absolute.path+/+filename" }
any inputs to get above form of json file
答案 5 :(得分:1)
此问题提醒如何确定两个 JavaScript对象的相等。 所以,我会选择this一般功能
比较JS对象:
function objectEquals(x, y) {
// if both are function
if (x instanceof Function) {
if (y instanceof Function) {
return x.toString() === y.toString();
}
return false;
}
if (x === null || x === undefined || y === null || y === undefined) { return x === y; }
if (x === y || x.valueOf() === y.valueOf()) { return true; }
// if one of them is date, they must had equal valueOf
if (x instanceof Date) { return false; }
if (y instanceof Date) { return false; }
// if they are not function or strictly equal, they both need to be Objects
if (!(x instanceof Object)) { return false; }
if (!(y instanceof Object)) { return false; }
var p = Object.keys(x);
return Object.keys(y).every(function (i) { return p.indexOf(i) !== -1; }) ?
p.every(function (i) { return objectEquals(x[i], y[i]); }) : false;
}
答案 6 :(得分:1)
lodash会工作,甚至测试角度为5 http://jsfiddle.net/L5qrfx3x/
var remoteJSON = {"allowExternalMembers": "false", "whoCanJoin":
"CAN_REQUEST_TO_JOIN"};
var localJSON = {"whoCanJoin": "CAN_REQUEST_TO_JOIN",
"allowExternalMembers": "false"};
if(_.isEqual(remoteJSON, localJSON)){
//TODO
}
它适用于以角度安装,请按this
答案 7 :(得分:0)
Lodash isEqual()
方法是比较两个JSON对象的最佳方法。
这将不考虑对象中键的顺序并检查对象的相等性。例子
const object1={
name:'ABC',
address:'India'
}
const object2={
address:'India',
name:'ABC'
}
JSON.stringify(object1)===JSON.stringify(object2)
// false
_.isEqual(object1, object2)
//true
参考-https://lodash.com/docs/#isEqual
如果序列不发生变化,那么与Lodash JSON.stringify()
方法相比,isEqual()
会更快
参考-https://www.measurethat.net/Benchmarks/Show/1854/0/lodash-isequal-test
答案 8 :(得分:0)
在VueJs函数中,您也可以使用它...使用递归的有效解决方案。基本积分Samadhan Sakhale
check_objects(obj1, obj2) {
try {
var flag = true;
if (Object.keys(obj1).length == Object.keys(obj2).length) {
for (let key in obj1) {
if(typeof (obj1[key]) != typeof (obj2[key]))
{
return false;
}
if (obj1[key] == obj2[key]) {
continue;
}
else if(typeof (obj1[key]) == typeof (new Object()))
{
if(!this.check_objects(obj1[key], obj2[key])) {
return false;
}
}
else {
return false;
}
}
}
else {
return false
}
}
catch {
return false;
}
return flag;
},
答案 9 :(得分:0)
我们使用node-deep-equal项目,该项目实现了与nodejs相同的深度平等比较
google serach for deep-equal on npm将为您显示许多替代方案
答案 10 :(得分:0)
如果您尝试比较这两个对象的目标与我的目标相同:即反序列化一个有效对象,在这种情况下,我建议您使用以下方法:
using Newtonsoft.Json;
try
{
var myObj = JsonConvert.DeserializeObject<**YourTargetObjectType**>(jsonString, new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Error
});
}catch (MissingMemberException mme)
{
throw;
}
如果发现错误,则您的对象不属于 YourTargetObjectType。否则最好去,你可以对第二个对象做同样的事情。
带有 MissingMemberHandling 的 JsonSerializerSetings 可以解决问题。在 mme 异常对象中,您可以检查哪个属性属性失败。这会验证额外的属性、缺失的属性和/或拼写错误的属性。
因此,在您的情况下,您应该有一个对象,它将用作比较两个对象的参考。
答案 11 :(得分:-1)
由于@zerkems评论:
我应该将我的字符串转换为JSON对象,然后调用相等的方法:
var x = eval("(" + remoteJSON + ')');
var y = eval("(" + localJSON + ')');
function jsonequals(x, y) {
// If both x and y are null or undefined and exactly the same
if ( x === y ) {
return true;
}
// If they are not strictly equal, they both need to be Objects
if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) {
return false;
}
// They must have the exact same prototype chain, the closest we can do is
// test the constructor.
if ( x.constructor !== y.constructor ) {
return false;
}
for ( var p in x ) {
// Inherited properties were tested using x.constructor === y.constructor
if ( x.hasOwnProperty( p ) ) {
// Allows comparing x[ p ] and y[ p ] when set to undefined
if ( ! y.hasOwnProperty( p ) ) {
return false;
}
// If they have the same strict value or identity then they are equal
if ( x[ p ] === y[ p ] ) {
continue;
}
// Numbers, Strings, Functions, Booleans must be strictly equal
if ( typeof( x[ p ] ) !== "object" ) {
return false;
}
// Objects and Arrays must be tested recursively
if ( !equals( x[ p ], y[ p ] ) ) {
return false;
}
}
}
for ( p in y ) {
// allows x[ p ] to be set to undefined
if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) {
return false;
}
}
return true;
}