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

问题描述 投票:0回答:8

我尝试查看其文档的 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
方法中的内容与以下内容更相似(即没有
$$hashkey
):

[
    {
        "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
  • 春季3.0.4

我还在服务器端使用 Spring security 3.0.7。

这不会给我带来任何问题,但我想知道

$$hashkey

的原因和原因
javascript jquery json angularjs
8个回答
552
投票

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
肯定不行。


74
投票

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

data = angular.toJson(source);

帮助删除

$$hashKey
属性,但结果将无法再由 X2JS 处理。

data = angular.copy(source);

也删除了

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


37
投票

它通常带有 ng-repeat 指令。为了进行 dom 操作,AngularJS 用特殊的 id 标记对象。

这在 Angular 中很常见。例如,如果你使用 ngResource 获取对象,你的对象将嵌入所有资源 API,并且你将看到 $save 等方法。对于 cookies,AngularJS 也会添加一个属性 __ngDebug。


24
投票

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

像这样:

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

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

8
投票

如果您使用 Angular 1.3 或更高版本,我建议您在 ng-repeat 中使用“track by”。如果您使用“track by”,Angular 不会向数组中的对象添加“$$hashKey”属性。您还可以获得性能优势,如果数组中的某些内容发生变化,Angular 不会为您的 ng-repeat 重新创建整个 DOM 结构,而是为数组中已更改的值重新创建 DOM 部分。


4
投票

更新:从 Angular v1.5 开始,由

$index
跟踪现在是标准语法,而不是使用链接,因为它给了我一个
ng-repeat
欺骗错误。

我遇到了这个嵌套的

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>

4
投票

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

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

$scope.myObject
- 指的是您要执行操作的对象,即从中删除 $$hashKey

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


1
投票

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

当人们第一次看到 Angular 时,它非常神奇。当您更新 JS 中的变量时,DOM 会自动更新,并且当有人更新 DOM 中的值时,同一变量也会在 JS 文件中更新。同样的功能可以跨页面元素和控制器工作。

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

这个 $$hashKey 会给那些将完整对象发送到不剥离额外数据的 API 的人带来很多困惑。 API 将为您的所有请求返回 400,但是 $$hashKey 不会从您的对象中消失。

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

考虑这个数组:

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

如果我们使用 ng-repeat="user in users" 将其渲染到列表中,则其中的每个对象都会从 Angular 接收一个 $$hashKey 用于跟踪目的。这里有两种方法可以避免这个$$hashKey。

© www.soinside.com 2019 - 2024. All rights reserved.