web-dev-qa-db-fra.com

Comment comparer deux JSON ayant les mêmes propriétés sans ordre?

J'ai essayé de comparer ces deux objets 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 />

J'ai eu des valeurs avec javascript et j'ai essayé de comparer avec: JSON.stringify(remoteJSON) == JSON.stringify(localJSON) mais ce retour est faux: il semble que l'ordre des propriétés est important.

Et j'ai même essayé de comparer en profondeur avec cette solution et j'ai toujours eu un faux retour.

Existe-t-il un moyen rapide de résoudre le problème avec jQuery (c'est-à-dire des bibliothèques permettant de comparer JSON)?

13
Drwhite

Lodash _.isEqual vous permet de le faire: 

var
remoteJSON = {"allowExternalMembers": "false", "whoCanJoin": "CAN_REQUEST_TO_JOIN"},
    localJSON = {"whoCanJoin": "CAN_REQUEST_TO_JOIN", "allowExternalMembers": "false"};
    
console.log( _.isEqual(remoteJSON, localJSON) );
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

15
Nicolas

Un moyen facile de comparer deux chaînes json en javascript

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
Samadhan Sakhale

lodash fonctionnera, testé même pour angular 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
    }

ça marche, pour une installation en angle, suivez ceci

1
Thomas John

Cette question rappelle comment déterminer égalité pour deux objets JavaScript . Je choisirais donc this fonction générale 

Compare les objets 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;
}
1
Giannis Grivas