Intenté buscar en la página de Mozilla JSON stringify de sus documentos, así como aquí en SO y Google, pero no encontré ninguna explicación. He usado JSOn stringify muchas veces, pero nunca encontré 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 para POST
ellos como un parámetro utilicé el método JSON.stringify () 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"
}
]
Tengo curiosidad por saber qué es exactamente la clave hash $$, ya que esperaba algo más similar al 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 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 causa ningún problema, pero me gustaría saber la causa y el motivo de la $$hashkey
javascript
jquery
json
angularjs
jonnie
fuente
fuente
Respuestas:
Angular agrega esto para realizar un seguimiento de sus cambios, de modo que sepa cuándo necesita actualizar el DOM.
Si usa en
angular.toJson(obj)
lugar deJSON.stringify(obj)
Angular, eliminará estos valores de uso interno por usted.Además, si cambia su expresión de repetición para usar el
track by {uniqueProperty}
sufijo, Angular no tendrá que agregar$$hashKey
nada. Por ejemploSolo recuerda siempre que necesitas el "enlace". parte de la expresión: siempre tiendo a olvidar eso. Simplemente
track by href
seguramente no funcionará.fuente
item in somelist | filter:somefilter track by item.key
¡no escriba el filtro al final de la línea!En mi caso de uso (alimentar el objeto resultante a X2JS), el enfoque recomendado
ayuda a eliminar las
$$hashKey
propiedades, pero X2JS ya no puede procesar el resultado .eliminó las
$$hashKey
propiedades también, pero el resultado se mantuvo utilizable como parámetro para X2JS.fuente
Viene con la directiva ng-repeat generalmente. Para hacer la manipulación dom AngularJS marca objetos con una identificación 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, etc. Con las cookies también, AngularJS agregará una propiedad __ngDebug.
fuente
Si no desea agregar identificadores a sus datos, puede realizar un seguimiento por el índice en la matriz, lo que hará que los elementos se clave por su posición en la matriz en lugar de su valor.
Me gusta esto:
fuente
Si está utilizando Angular 1.3 o superior, le recomiendo que use "track by" en su ng-repeat. Angular no agrega una propiedad "$$ hashKey" a los objetos en 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.
fuente
Actualización: desde Angular v1.5, el seguimiento por
$index
ahora es la sintaxis estándar en lugar de usar el enlace, ya que me dio unng-repeat
error de duplicación.Me encontré con esto por un anidado
ng-repeat
y el siguiente funcionó.fuente
Así es como puede eliminar fácilmente la $$ hashKey del objeto:
$scope.myObject
- Se refiere al objeto sobre el que desea realizar la operación, es decir, elimine $$ hashKey de$scope.myNewObject
- Asigne el objeto original modificado al nuevo objeto para que pueda usarse según sea necesariofuente
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 actualiza su valor en el DOM. Esta misma funcionalidad funciona en todos los elementos de la página y en todos los controladores.
La clave de todo esto es el $$ hashKey Angular adjuntos a objetos y matrices utilizados en ng-repeats.
Este $$ hashKey causa mucha confusión a las personas que envían objetos completos a una API que no elimina datos adicionales. La API devolverá un 400 para todas sus solicitudes, pero ese $$ hashKey simplemente no desaparecerá de sus objetos.
Angular usa $$ hashKey para realizar un seguimiento de qué elementos del DOM pertenecen a qué elemento de una matriz que se está enlazando en una repetición ng. Sin $$ hashKey Angular no habría forma de aplicar los cambios que ocurren en JavaScript o DOM a su contraparte, que es uno de los principales usos de Angular.
Considere esta matriz:
Si lo procesamos en una lista usando ng-repeat = "user in users", cada objeto en él recibiría una $$ hashKey para fines de seguimiento de Angular. Aquí hay dos formas de evitar este $$ hashKey.
fuente