¿Cuál es el hash HashKey añadido a mi JSON.stringify resultado


He intentado buscar en el Mozilla JSON stringify página de sus documentos, así como aquí en SO y Google, pero no encontró ninguna explicación. He utilizado JSOn stringify muchas veces, pero nunca me he encontrado con este resultado

Tengo una matriz de objetos 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"
    }
]

Adjunto a mi $scope y con el fin de POST ellos como un paramater utilicé el JSON.stringify () método y obtengo lo siguiente:

   [
        {
            "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"
        }
    ]

Solo tengo curiosidad por saber qué es exactamente el hash hashkey como esperaba algo más similar a lo siguiente del método stringify:

[
    {
        "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"
        }
    }
]

No estoy seguro de si es un factor, pero estoy usando Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side

No me está causando ningún problema, pero me gustaría saber la causa y la razón de la $$hashkey

Author: jonnie, 2013-09-16

8 answers

Angular agrega esto para realizar un seguimiento de sus cambios, para que sepa cuándo necesita actualizar el DOM.

Si usa angular.toJson(obj) en lugar de JSON.stringify(obj), Angular eliminará estos valores de uso interno por usted.

Además, si cambia su expresión repetida para usar el sufijo track by {uniqueProperty}, Angular no tendrá que agregar $$hashKey en absoluto. Por ejemplo

<ul>
    <li ng-repeat="link in navLinks track by link.href">
        <a ng-href="link.href">{{link.title}}</a>
    </li>
</ul>

Solo recuerda siempre que necesitas el enlace"."parte de la expresión - siempre tiendo a olvidar. Solo track by href seguramente no funcionará.

 499
Author: David Boike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-29 12:53:02

En mi caso de uso (alimentar el objeto resultante a X2JS) el enfoque recomendado

data = angular.toJson(source);

Ayuda a eliminar las propiedades $$hashKey, pero el resultado ya no puede ser procesado por X2JS.

data = angular.copy(source);

También eliminó las propiedades $$hashKey, pero el resultado permaneció utilizable como parámetro para X2JS.

 67
Author: RobE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-21 06:06:48

Normalmente viene con la directiva ng-repeat. Para hacer la manipulación dom AngularJS marca objetos con un id especial.

Esto es común con Angular. Por ejemplo, si obtiene un objeto con ngResource, su objeto incrustará toda la API de recursos y verá métodos como save save, etc. Con las cookies también AngularJS añadirá una propiedad _ _ ngDebug.

 36
Author: Thomas Pons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-16 12:50:26

Si no desea agregar ID a sus datos, puede realizar un seguimiento por el índice en la matriz, lo que hará que los elementos se introduzcan por su posición en la matriz en lugar de su valor.

Así:

var myArray = [1,1,1,1,1];

<li ng-repeat="item in myArray track by $index">
 23
Author: Michael Falck Wedelgård,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-11 05:48:28

Si está utilizando Angular 1.3 o superior, le recomiendo que utilice "track by" en su ng-repeat. Angular no agrega una propiedad "hash HashKey" a los objetos de su matriz si usa "track by". También obtiene beneficios de rendimiento, si algo en su matriz cambia, angular no recrea toda la estructura DOM para su ng-repeat, sino que recrea la parte del DOM para los valores en su matriz que han cambiado.

 7
Author: Ajay Ullal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 06:31:16

Actualización : Desde Angular v1.5, track by $index es ahora la sintaxis estándar en lugar de usar link, ya que me dio un error de ng-repeat dupes.

Me encontré con esto para un anidado ng-repeat y el siguiente funcionó.

<tbody>
    <tr ng-repeat="row in data track by $index">
    <td ng-repeat="field in headers track by $index">{{row[field.caption] }}</td>
</tr>
 3
Author: Vinnie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 16:25:45

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

Angular es bastante mágico la primera vez que la gente lo ve. El DOM se actualiza automáticamente cuando actualiza una variable en su JS, y la misma variable se actualizará en su archivo JS cuando alguien actualice su valor en el DOM. Esta misma funcionalidad funciona en todos los elementos de la página y en todos los controladores.

La clave para todo esto es el Angular HashKey Angular se une a los objetos y matrices utilizados en ng-repeats.

Esto hash HashKey causa mucha confusión para las personas que están enviando objetos completos a una API que no elimina datos adicionales. La API devolverá un 400 para todas sus solicitudes, pero ese hash HashKey no desaparecerá de sus objetos.

Angular utiliza el hash HashKey para realizar un seguimiento de qué elementos en el DOM pertenecen a qué elemento en un array que se está enlazando en un bucle ng-repeat. Sin el Angular HashKey Angular no tendría forma de aplicar los cambios que se producen en el JavaScript o DOM a su contraparte, que es uno de los principales usos para Angular.

Considere esta matriz:

users = [  
    {
         first_name: "Tim"
         last_name: "Costa"
         email: "[email protected]"
    }
]

Si lo renderizamos en una lista usando ng-repeat="user in users", cada objeto en ella recibiría un hash HashKey para propósitos de seguimiento de Angular. Aquí hay dos maneras de evitar esto hash HashKey.

 1
Author: alfishan aqeel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-30 12:08:59

Así es como puede eliminar fácilmente el hash HashKey del objeto:

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

$scope.myObject - Se refiere al Objeto en el que desea realizar la operación, es decir, eliminar el hash HashKey de

$scope.myNewObject - Asigne el objeto original modificado al nuevo objeto para que pueda ser utilizado según sea necesario

 1
Author: Devner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-04 01:21:51