ejemplo - string to json javascript
¿Qué es el hashKey $$ añadido a mi resultado JSON.stringify (8)
He intentado buscar en la página de Strilla de Mozilla JSON de sus documentos, así como aquí en SO y Google, pero no he encontrado 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
como un solo parámetro usé 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"
}
]
Solo tengo curiosidad por saber exactamente cuál es el hashkey $$, ya que esperaba algo más similar al siguiente del método de clasificación:
[
{
"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 del $$hashkey
Actualización: de Angular v1.5, track by $index
ahora es la sintaxis estándar en lugar de usar el enlace, ya que me dio un error de ng-repeat
.
Me encontré con esto para una ng-repeat
anidada y funcionó a continuación.
<tbody>
<tr ng-repeat="row in data track by $index">
<td ng-repeat="field in headers track by $index">{{row[field.caption] }}</td>
</tr>
Angular agrega esto para hacer un seguimiento de sus cambios, para que sepa cuándo necesita actualizar el DOM.
Si usa angular.toJson(obj)
lugar de JSON.stringify(obj)
entonces Angular eliminará estos valores de uso interno para usted.
Además, si cambia la expresión de repetición para usar la track by {uniqueProperty}
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>
Siempre recuerda que necesitas el "enlace". parte de la expresión - siempre tiendo a olvidar eso. Simplemente track by href
seguramente no funcionará.
Aquí es cómo puede eliminar fácilmente la 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 la hashKey $$ de
$scope.myNewObject
- Asigna el objeto original modificado al nuevo objeto para que pueda usarse según sea necesario
En mi caso de uso (alimentando el objeto resultante a X2JS) el enfoque recomendado
data = angular.toJson(source);
ayuda para eliminar las propiedades $$hashKey
, pero el resultado ya no podría ser procesado por X2JS .
data = angular.copy(source);
también eliminó las propiedades $$hashKey
, pero el resultado siguió siendo utilizable como parámetro para X2JS.
Si está utilizando Angular 1.3 o superior, le recomiendo que use "seguimiento por" en su repetición ng. 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 la estructura DOM completa para su repetición ng, sino que recrea la parte de DOM para los valores en su matriz que han cambiado.
Si no desea agregar ID a sus datos, puede realizar un seguimiento por el índice en la matriz, lo que hará que los elementos queden identificados por su posición en la matriz en lugar de su valor.
Me gusta esto:
var myArray = [1,1,1,1,1];
<li ng-repeat="item in myArray track by $index">
Viene con la directiva ng-repeat generalmente. Para realizar la manipulación dom AngularJS marca los objetos con id especial.
Esto es común con Angular. Por ejemplo, si obtiene un objeto con ngResource, su objeto incorporará toda la API de recursos y verá métodos como $ save, etc. Con las cookies también, AngularJS agregará una propiedad __ngDebug.
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 los elementos de la página y en los controladores.
La clave de todo esto es que $$ hashKey Angular se une a los objetos y matrices que se utilizan en ng-repeticiones.
Esta $$ hashKey causa mucha confusión para 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 esa hashKey $$ simplemente no desaparecerá de sus objetos.
Angular usa la hashKey $$ para realizar un seguimiento de qué elementos en el DOM pertenecen a qué elemento en una matriz que se está repitiendo en una repetición ng. Sin el $$ hashKey, Angular no tendría forma de aplicar los cambios que se producen en JavaScript o DOM a su contraparte, que es uno de los usos principales de Angular.
Considera esta matriz:
users = [
{
first_name: "Tim"
last_name: "Costa"
email: "[email protected]"
}
]
Si representamos eso en una lista usando ng-repeat = "usuario en usuarios", cada objeto en ella recibirá una $$ hashKey con fines de seguimiento desde Angular. Aquí hay dos maneras de evitar esta $$ hashKey.