什么是$ $$ hashKey添加到我的JSON.stringify结果

我曾尝试寻找他们的文档的Mozilla JSON stringify页面以及SO和Google的这里,但没有find任何解释。 我已经使用JSOn很多时间,但从来没有遇到过这个结果

我有一个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" } ] 

附加到我的$scope和为了发布他们作为一个参数我使用JSON.stringify()方法,我得到以下内容:

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

我只是好奇什么是$$ hashkey,因为我期望从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" } } ] 

我不知道这是否是一个因素,但我Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side使用Angularjs 1.1.5, JQuery 1.8.2 and Spring 3.0.4 and Spring security 3.0.7 on the Server side

这不是导致我任何问题,但我想知道$$hashkey的原因和原因

Angular增加了这个来跟踪你的改变,所以它知道什么时候需要更新DOM。

如果您使用angular.toJson(obj)而不是JSON.stringify(obj)那么Angular将为您删除这些内部使用的值。

此外,如果您track by {uniqueProperty}后缀更改重复expression式以使用track by {uniqueProperty} ,Angular将不必添加$$hashKey 。 例如

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

只要永远记住你需要“链接”。 expression的一部分 – 我总是倾向于忘记这一点。 只需track by href肯定不会工作。

在我的使用情况下(将产生的对象提供给X2JS)推荐的方法

 data = angular.toJson(source); 

帮助删除$$hashKey属性,但结果可能不再由X2JS处理。

 data = angular.copy(source); 

也删除了$$hashKey属性,但结果仍然可用作X2JS的参数。

它通常带有ng-repeat指令。 做dom操作AngularJS标记具有特殊id的对象。

这在Angular中很常见。 例如,如果你用ngResource获得对象,你的对象将embedded所有的资源API,你会看到像$ save等方法。同样,Cookie也会添加一个属性__ngDebug。

如果您不想将数据添加到数据中,您可以使用数组中的索引进行跟踪,这将导致项目按照在数组中的位置而不是其值。

喜欢这个:

 var myArray = [1,1,1,1,1]; <li ng-repeat="item in myArray track by $index"> 

如果您使用的是Angular 1.3或更高版本,我build议您在ng-repeat中使用“track by”。 如果使用“track by”,Angular不会为数组中的对象添加“$$ hashKey”属性。 你也可以获得性能上的好处,如果你的数组中的内容发生了变化,angular并不会为你的ng-repeat重新创build整个DOM结构,它将为你的数组中已经改变的值重新创buildDOM的一部分。

更新:从Angular v1.5开始,跟踪$index现在是标准语法,而不是使用链接,因为它给了我一个ng-repeat dupes错误。

我遇到了这个嵌套ng-repeat和下面的工作。

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

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

人们第一次看到Angular就相当神奇。 在更新JS中的variables时自动更新DOM,当有人更新其在DOM中的值时,同样的variables将在您的JS文件中更新。 这个相同的function在页面元素和控制器之间起作用。

所有这一切的关键是$$ hashKey Angular附加到ng-repeats中使用的对象和数组。

对于将完整对象发送到不剥除额外数据的API的人来说,这个$$ hashKey会引起很多混淆。 API将为您的所有请求返回一个400,但该$$ hashKey只是不会离开您的对象。

Angular使用$$ hashKey来跟踪DOM中的哪些元素属于循环的数组中的哪个项目。 如果没有$$ hashKey Angular将无法将JavaScript或DOM中发生的更改应用到其对应的对象,这是Angular的主要用途之一。

考虑这个数组:

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

如果我们使用ng-repeat =“user in user”将其渲染到列表中,那么其中的每个对象都将从Angular接收用于跟踪目的的$$ hashKey。 这里有两种方法来避免这个$$ hashKey。

这里是如何轻松地从对象中移除$$ hashKey的:

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

$scope.myObject – 引用你想要执行操作的对象,即从中删除$$ hashKey

$scope.myNewObject – 将修改的原始对象分配给新对象,以便可以根据需要使用它