10
votes

Comment comparer deux Jsons en ignorant l'ordre des éléments dans les propriétés du tableau?

J'ai besoin de comparer deux chaînes qui représentent des objets JSON. À des fins de test, j'ai besoin d'un moyen de comparer ces chaînes ignorant non seulement l'ordre des éléments de l'enfant (qui est assez courant) mais de l'ordre des éléments dans les propriétés de la matrice de Jsons. IE:

group: {
    id: 123,
    users: [
       {id: 345, name: Mike},
       {id: 234, name: John}
    ]
}


1 commentaires

6 Réponses :


2
votes

Je ne sais pas si cette chose existe, mais vous pouvez la mettre en œuvre vous-même. XXX


0 commentaires

1
votes

Vous pouvez couper les matrices, triez-les par ID, puis les limitez-les à JSON et comparez les chaînes. Pour beaucoup de membres, cela devrait fonctionner assez vite. Si vous dupliquez des identifiants en double, cela échouera car Trier ne changera pas la commande.


0 commentaires

13
votes

Utilisez JONSASERT

Ils ont une revendication lâche.

Lâche: xxx

strict: xxx


3 commentaires

Cela ressemble à une solution Java, mais l'OP étiqueté la question avec JavaScript.


"Mais d'autres approches bienvenues pour" C'est une autre approche :)


Cherchait une approche Java. Je ne m'attendais pas à le trouver ici :)



0
votes

Voici ma tentative d'implémentation personnalisée: strong> xxx pré>

un exemple de celui-ci avec des étuis de test: strong> p> p>

<div id=out></div>


2 commentaires

Je serais reconnaissant si quelqu'un découvre une affaire de bord qui ne fonctionne pas avec cette solution.


Eh bien, l'exemple original de l'OP, pour une chose :) Le problème est que la mise en œuvre devrait essentiellement traiter des tableaux en tant que jeux.



0
votes

J'aime la solution de Francis et ça va très bien.

Il suffit d'ajouter la vérification nulle suivante au début de la fonction code> égale > pour empêcher les erreurs avec des entrées NULL ou non définies. P>

function equal(a, b) {
    if (a == null && b == null) {
      return true;
    }
    if (a == null || b == null) {
      return false;
    }
    if (typeof a !== typeof b) return false;
    if (a.constructor !== b.constructor) return false;

    if (a instanceof Array)
    {
        return arrayEqual(a, b);
    }

    if(typeof a === "object")
    {
        return objectEqual(a, b);
    }

    return a === b;
}

function objectEqual(a, b) {
    for (var x in a)
    {
         if (a.hasOwnProperty(x))
         {
             if (!b.hasOwnProperty(x))
             {
                 return false;
             }

             if (!equal(a[x], b[x]))
             {
                 return false;
             }
         }
    }

    for (var x in b)
    {
        if (b.hasOwnProperty(x) && !a.hasOwnProperty(x))
        {
            return false;
        }
    }

    return true;
}

function arrayEqual(a, b) {
    if (a.length !== b.length)
    {
        return false;
    }

    var i = a.length;

    while (i--)
    {
        var j = b.length;
        var found = false;

        while (!found && j--)
        {
            if (equal(a[i], b[j])) found = true;
        }

        if (!found)
        {
            return false;
        }
    }

    return true;
}


0 commentaires

0
votes

Cette réponse décrit une solution pour le problème à l'aide de Deltajson API de repos. Deltajson est un produit commercial qui fournit l'API sous forme de service (SaaS) ou via un serveur de repos pouvant être exécuté localement:

  1. Démarrer le serveur de repos de Deltajson (nécessite Installation Java et un fichier de licence): LI> ol> xxx pré>
    1. Dans votre JavaScript, appelez l'API de repos Deltajson avec le paramètre Arrayalignment code> sur sans commande code>. li> ol>

      Le code exemple ci-dessous montre comment appeler l'API avec ce paramètre de propriété: P>

      {
        "dx_deltaJSON": {
          "dx_data_sets": "A!=B",
          "dx_deltaJSON_type": "diff",
          "dx_deltaJSON_metadata": {
            "operation": {
              "type": "compare",
              "input-format": "multi_part",
              "output-format": "JSON"
            },
            "parameters": {
              "dxConfig": [],
              "arrayAlignment": "orderless",
              "wordByWord": false
            }
          },
          "dx_deltaJSON_delta": {
            "id": 123,
            "users": [
              {
                "id": 345,
                "name": {
                  "dx_delta": {
                    "A": "Mike",
                    "B": "Mikey"
                  }
                }
              },
              {
                "id": 234,
                "name": "John"
              }
            ]
          }
        }
      }
      


0 commentaires