我试着在他们的文档的Mozilla JSON stringify页面以及这里的SO和谷歌上找不到解释。我使用了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安全性3.0.7。

它没有给我带来任何问题,但我想知道$$hashkey的原因和原因


当前回答

在我的用例中(将结果对象提供给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。

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

data = angular.toJson(source);

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

data = angular.copy(source);

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

下面是简单地从对象中删除$$hashKey的方法:

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

美元的范围。myObject -指向你想要执行操作的对象,即删除$$hashKey

美元的范围。myNewObject -将修改后的原始对象分配给新对象,以便在必要时使用它

Angular添加这个来跟踪你的更改,这样它就知道什么时候需要更新DOM。

如果你使用Angular . tojson (obj)而不是JSON.stringify(obj),那么Angular会为你去掉这些内部使用的值。

同样,如果你将repeat表达式更改为使用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>

只要记住你需要“链接”这部分的表达-我总是倾向于忘记这一点。仅仅通过href跟踪肯定是行不通的。

如果你使用的是Angular 1.3或更高版本,我建议你在ng-repeat中使用"track by"。如果你使用了"track by", Angular不会给数组中的对象添加"$$hashKey"属性。你还可以获得性能上的好处,如果数组中的某些东西发生了变化,angular不会为ng-repeat重新创建整个DOM结构,而是为数组中发生变化的值重新创建DOM的那一部分。