0
votes

JavaScript Comment comparer uniquement les clés et non les valeurs de JSON

J'ai deux objets JSON nuls

exports.compareObjects = async(model, response) => {

      switch (Object.prototype.toString.call(model)) {
          case '[object]':
              var x;
              var mKeys = Object.keys(model);
              for (x in mKeys) {
                  return this.compareObjects(Object.keys(model)[x], Object.keys(response)[x]);
              }
              break;
              case '[object Object]':
                var x1;
                var mKeys1 = Object.keys(model);
                for (x1 in mKeys1) {
                    return this.compareObjects(Object.keys(model)[x1], Object.keys(response)[x1]);
                }
                break;
          case '[object Array]':
              return this.compareObjects(model[0], response[0]);

          // case '[object String]':
          //     return model === response;

          default:
              return true;
      }
};



0 commentaires

3 Réponses :


0
votes

pourrait être que vous pourriez le résoudre par cette ligne xxx

do xxx

je le ferais comme ça 1. Vous n'avez besoin que de comparer des objets (tous les autres n'ont pas de clés) 2. Recurez si la valeur est également objet xxx


0 commentaires

1
votes

Ceci utilise une recherche de clé récursive pour créer un tableau de clés dans chaque objet que vous souhaitez comparer.

Il teste une égalité assez stricte (aucune touche supplémentaire dans l'objet) p>

P >

let obj1 = JSON.parse(`{
    "version": "1",
    "user": {
        "id": 123
    }
}`);

let obj2 = JSON.parse(`{
    "version": "1",
    "user": {
        "i": 123
    }
}`);

let obj3 = JSON.parse(`{
    "version": "1",
    "user": {
        "id": 123
    }
}`);

let obj4 = JSON.parse(`{
    "version": "1",
    "user": {
        "id": 12
    }
}`);

let test1 = structureIsEqual(obj1, obj2);
let test2 = structureIsEqual(obj3, obj4);

console.log('Structure of first two match: ' + test1);
console.log('Structure of second two match: ' + test2);

function structureIsEqual(obj1, obj2) {
  let tree1 = getKeys(obj1).sort();
  let tree2 = getKeys(obj2).sort();
  
  if(tree1.length !== tree2.length)
    return false;
  
  let mismatch = tree1.find((x, idx) => tree2[idx] !== x);
  return !mismatch;
}

function getKeys(obj) {
  return recursiveKeys(obj, [], []);  
}

function recursiveKeys(obj, result, todo, root = '') {  
  Object.keys(obj).forEach(key => {
    if(typeof obj[key] === 'object') {      
      result.push(root + key);
      todo.push({ obj: obj[key], root: root + key + '.' });      
    } else {
      result.push(root + key);
    }
  });
  
  if(todo.length > 0) {
    let todoItem = todo.pop();
    return recursiveKeys(todoItem.obj, result, todo, todoItem.root);
  }else {
    return result;
  }
}


0 commentaires

0
votes
        var compareObjects = (model, response) => {
      switch (Object.prototype.toString.call(model)) {
          case '[object]':
              var x;
              var mKeys = Object.keys(model);
              for (x in mKeys) {
                  return this.compareObjects(Object.keys(model)[x], Object.keys(response)[x]);
              }
              break;
              case '[object Object]':
                var x1;
                var mKeys1 = Object.keys(model);

                for (x1 in mKeys1) {
                    let t = this.compareObjects(Object.keys(model)[x1], Object.keys(response)[x1]);
                    if(!t){
                      return false
                    }

                    if(typeof model[mKeys1[x1]] == "object"){
                     return this.compareObjects(model[mKeys1[x1]], response[mKeys1[x1]])
                    }


                }

          case '[object Array]':
              return this.compareObjects(model[0], response[0]);

          case '[object String]':
              return model === response;

          default:
              return true;
      }
};
let a = {
    "version": "1",
    "user": {
        "id": 123,
        "n":"d",
         "j":{
          "ns":"m"
        }
    }
}
let b = {
    "version": "1",
    "user": {
        "id": 123,
        "n":"d",
        "j":{
          "ns":"m"
        }
    }
}
var t = compareObjects(a,b)
console.log(t)

0 commentaires