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

IT技术 javascript jquery json angularjs
2021-01-25 04:27:22

我曾尝试查看他们文档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
  • Spring 3.0.4

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

它没有给我造成任何问题,但我想知道原因和原因 $$hashkey

6个回答

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

笔记!我正在使用一个带有克隆方法的数组,该方法将元素复制然后插入到一个数组中,然后由 ng-repeat 呈现。使用 JSON.parse(JSON.stringify(obj)) 克隆我的元素时,我遇到了角度“重复键”错误。使用 JSON.parse(angular.toJson(obj)); 固定的东西。谢谢!
2021-03-17 04:27:22
是否有关于 «track by» 和 «$$hashKey» 的性能测试?(UPD。好吧,我已经用谷歌搜索了它,“跟踪”更可取)
2021-04-02 04:27:22
如果您只显示数据,您还可以使用使用双冒号 :: 的一次性绑定功能来防止更新。<a ng-href="link.href">{{::link.title}}</a>
2021-04-03 04:27:22
如果你有一个过滤器要应用,这里是正确的顺序:item in somelist | filter:somefilter track by item.key不要在行尾写过滤器!
2021-04-06 04:27:22
@artuska 通过 id 跟踪非常简单,因为不需要计算散列,您只需重用现有的 id 或增加一个计数器......
2021-04-08 04:27:22

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

data = angular.toJson(source);

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

data = angular.copy(source);

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

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

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

如果您尝试删除该属性,Angular 模型将会中断,我建议复制该变量。请参阅@David-Boike 关于如何过滤掉哈希键的回答
2021-04-01 04:27:22
我应该如何删除这些属性?角度是否提供了任何方法来做到这一点?
2021-04-04 04:27:22

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

像这样:

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

<li ng-repeat="item in myArray track by $index">
这需要假设您的项目的顺序永远不会改变。:)
2021-03-14 04:27:22

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