296 votes

Que représente la $$hashKey ajoutée à mon résultat JSON.stringify

J'ai essayé de chercher sur le site Mozilla JSON stringify J'ai consulté la page de leur documentation ainsi qu'ici sur SO et Google mais je n'ai trouvé aucune explication. J'ai utilisé JSON.stringify plusieurs fois mais je n'ai jamais rencontré ce résultat.

J'ai un tableau d'objets JSON :

[
    {
        "param_2": "Description 1",
        "param_0": "Name 1",
        "param_1": "VERSION 1"
    },
    {
        "param_2": "Description 2",
        "param_0": "Name 2",
        "param_1": "VERSION 2"
    },
    {
        "param_2": "Description 3",
        "param_0": "Name 3",
        "param_1": "VERSION 3"
    }
]

Il est attaché à mon $scope . Afin de POST comme un seul paramètre, j'ai utilisé le JSON.stringify() et recevoir ce qui suit :

   [
        {
            "param_2": "Description 1",
            "param_0": "Name 1",
            "param_1": "VERSION 1",
            "$$hashKey": "005"
        },
        {
            "param_2": "Description 2",
            "param_0": "Name 2",
            "param_1": "VERSION 2",
            "$$hashKey": "006"
        },
        {
            "param_2": "Description 3",
            "param_0": "Name 3",
            "param_1": "VERSION 3",
            "$$hashKey": "007"
        }
    ]

Je suis juste curieux de savoir ce que le $$hashkey est exactement, car je m'attendais à quelque chose de plus similaire à ce qui suit à partir de la propriété stringify (c'est-à-dire sans la méthode $$hashkey ):

[
    {
        "1":{
            "param_2": "Description 1",
            "param_0": "Name 1",
            "param_1": "VERSION 1"
        },
         "2":{
            "param_2": "Description 2",
            "param_0": "Name 2",
            "param_1": "VERSION 2"
        },
         "3":{
            "param_2": "Description 3",
            "param_0": "Name 3",
            "param_1": "VERSION 3"
        }
    }
]

Je ne sais pas si c'est un facteur, mais j'utilise ce qui suit :

  • Angularjs 1.1.5,
  • JQuery 1.8.2
  • Spring 3.0.4

J'utilise également Spring security 3.0.7 du côté du serveur.

Il ne me pose aucun problème, mais j'aimerais connaître la cause et la raison de l'apparition de l'événement. $$hashkey

8 votes

Il est ajouté par angularjs

1 votes

72 votes

Au lieu de JSON.stringify, utilisez angular.toJson()

4voto

Vinay Points 568

Mise à jour : A partir d'Angular v1.5, piste par $index est maintenant la syntaxe standard au lieu d'utiliser le lien, car cela me donnait une ng-repeat erreur de duplication.

J'ai rencontré ce problème pour un ng-repeat et ce qui suit a fonctionné.

<tbody>
    <tr ng-repeat="row in data track by $index">
    <td ng-repeat="field in headers track by $index">{{row[field.caption] }}</td>
</tr>

4voto

Devner Points 1160

Voici comment vous pouvez facilement supprimer la $$hashKey de l'objet :

$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))

$scope.myObject - Désigne l'objet sur lequel vous souhaitez effectuer l'opération, par exemple, supprimer la clé $$hashKey de l'objet

$scope.myNewObject - Attribuer l'objet original modifié au nouvel objet afin qu'il puisse être utilisé si nécessaire.

1voto

alfishan aqeel Points 170

https://www.timcosta.io/angular-js-object-comparisons/

Angular est assez magique la première fois que les gens le voient. Le DOM est automatiquement mis à jour lorsque vous mettez à jour une variable dans votre JS, et cette même variable sera mise à jour dans votre fichier JS lorsque quelqu'un mettra à jour sa valeur dans le DOM. Cette même fonctionnalité fonctionne à travers les éléments de la page, et à travers les contrôleurs.

La clé de tout ceci est la $$hashKey qu'Angular attache aux objets et aux tableaux utilisés dans ng-repeats.

Cette $$hashKey est source de confusion pour les personnes qui envoient des objets complets à une API qui ne supprime pas les données supplémentaires. L'API renverra un 400 pour toutes vos demandes, mais cette $$hashKey ne disparaîtra pas de vos objets.

Angular utilise la $$hashKey pour garder la trace de quels éléments du DOM appartiennent à quel élément d'un tableau qui est parcouru en boucle dans un ng-repeat. Sans la $$hashKey, Angular n'aurait aucun moyen d'appliquer les changements qui se produisent dans le JavaScript ou le DOM à leur contrepartie, ce qui est l'une des principales utilisations d'Angular.

Considérez ce tableau :

users = [  
    {
         first_name: "Tim"
         last_name: "Costa"
         email: "tjsail33@gmail.com"
    }
]

Si nous transformions cette liste en utilisant ng-repeat="user in users", chaque objet de cette liste recevrait une $$hashKey à des fins de suivi par Angular. Voici deux façons d'éviter cette $$hashKey.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X