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

时间:2013-09-16 10:58:54

标签: javascript jquery json angularjs

我已尝试查看其文档的Mozilla JSON stringify页面以及此处的SO和Google,但未找到任何解释。我已经多次使用JSOn stringify但从未遇到过这个结果

我有一个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,为了POST他们作为一个参数我使用了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

这不会引起任何问题,但我想知道$$hashkey

的原因和原因

8 个答案:

答案 0 :(得分:513)

Angular添加了这个以跟踪您的更改,因此它知道何时需要更新DOM。

如果您使用angular.toJson(obj)代替JSON.stringify(obj),则Angular会为您删除这些内部使用值。

此外,如果您更改重复表达式以使用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>

永远记住你需要“链接”。表达的一部分 - 我总是倾向于忘记这一点。只是track by href肯定无法正常工作。

答案 1 :(得分:69)

在我的用例中(将生成的对象提供给X2JS)推荐的方法

data = angular.toJson(source);

帮助删除$$hashKey属性,但X2JS无法再处理结果。

data = angular.copy(source);

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

答案 2 :(得分:37)

通常带有ng-repeat指令。要进行dom操作,AngularJS会标记具有特殊ID的对象。

这与Angular很常见。例如,如果您使用ngResource获取对象,您的对象将嵌入所有资源API,您将看到$ save等方法。对于Cookie,AngularJS将添加属性__ngDebug。

答案 3 :(得分:23)

如果您不想在数据中添加ID,则可以按数组中的索引进行跟踪,这会导致项目按其在数组中的位置而不是其值来键入

像这样:

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

<li ng-repeat="item in myArray track by $index">

答案 4 :(得分:8)

如果您使用的是Angular 1.3或更高版本,我建议您使用&#34; track by&#34;在你的重复。 Angular没有添加&#34; $$ hashKey&#34;如果使用&#34; track by&#34;,则为数组中对象的属性。您还可以获得性能优势,如果数组中的某些内容发生更改,则角度不会为ng-repeat重新创建整个DOM结构,而是会为数组中已更改的值重新创建DOM的一部分。

答案 5 :(得分:4)

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

我遇到了嵌套ng-repeat以及下面的工作。

ng-repeat

答案 6 :(得分:1)

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

Angular在人们第一次看到它时非常神奇。更新JS中的变量时自动更新DOM,当有人在DOM中更新其值时,相同的变量将在JS文件中更新。相同的功能适用于页面元素和控制器。

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

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

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

考虑这个数组:

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

如果我们使用用户&#34;中的ng-repeat =&#34; user将其呈现为列表,则其中的每个对象都将从Angular接收$$ hashKey以进行跟踪。以下两种方法可以避免使用这个$$ hashKey。

答案 7 :(得分:1)

以下是如何从对象中轻松删除$$ hashKey:

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

$scope.myObject - 指想要执行操作的对象,即从

中删除$$ hashKey

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