4
votes

Comparez deux objets avec la même propriété mais ils se mélangent sans suivre une règle alphabétique

Au cas où j'aurais deux objets:

const sortA = JSON.stringify(Object.keys(a).sort) 
const sortB = JSON.stringify(Object.keys(b).sort)

expected(sortA).toEquals(sortB)

Je sais comment trier les propriétés par les clés de tri de l'objet mais je ne sais pas comment les analyser en objet.

Exemple:

const a = {
   sample: 'this is sample',
   errorMessage: 'status is error'
}

const b = {
   errorMessage: 'status is error'
   sample: 'this is sample',
}


1 commentaires

Object.keys (a) .sort Ne trie pas un objet par ses clés.


3 Réponses :


1
votes

Vous devez utiliser toEqual pour cette comparaison d'objets:

expected(sortA).toEqual(sortB)


0 commentaires

4
votes

Vous pouvez prendre les entrées de l'objet, trier par clé, obtenir JSON et comparer les chaînes.

Cela fonctionne uniquement pour les objets non imbriqués.

const
    sortBy = k => (a, b) => a[k].localeCompare(b[k]),
    a = { sample: 'this is sample', errorMessage: 'status is error' },
    b = { errorMessage: 'status is error', sample: 'this is sample' },
    sortA = JSON.stringify(Object.entries(a).sort(sortBy(0))),
    sortB = JSON.stringify(Object.entries(b).sort(sortBy(0)));

console.log(sortA === sortB);


0 commentaires

1
votes

Vous devriez plutôt créer une fonction qui fait cela:

const a = {
   sample: 'this is sample',
   errorMessage: 'status is error',
};

const b = {
   errorMessage: 'status is error',
   sample: 'this is sample',
};

const c = {
   errorMessage: 'status is error !',
   sample: 'this is sample',
};

const compare = (ob1, ob2) => 
  Object.keys(ob1).length === Object.keys(ob2).length
  && !Object.keys(ob1).some(key => ob2[key] !== ob1[key]);
  
  console.log(compare(a, b));
  console.log(compare(a, c));


0 commentaires