什么是 $$hashKey 添加到我的 JSON.stringify 结果
Posted
技术标签:
【中文标题】什么是 $$hashKey 添加到我的 JSON.stringify 结果【英文标题】:What is the $$hashKey added to my JSON.stringify result 【发布时间】:2013-09-20 12:04:00 【问题描述】:我尝试查看他们文档的 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
的原因和原因
【问题讨论】:
是angularjs添加的 groups.google.com/forum/#!topic/angular/pI0IgNHKjxw 而不是 JSON.stringify 使用 angular.toJson() 谢谢各位,如果有人想添加您的解释作为答案,我很乐意接受 这个答案很好解释..***.com/questions/12336897/… 【参考方案1】: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
肯定不行。
【讨论】:
有没有关于 «track by» 与 «$$hashKey» 的性能测试? (UPD。好的,我已经用谷歌搜索过了,“track by”更可取) @artuska 通过 id 跟踪非常简单,因为无需计算哈希值,您只需重用现有 id 或增加一个计数器... 如果你有一个过滤器要应用,这里是正确的顺序:item in somelist | filter:somefilter track by item.key
,不要在行尾写过滤器!
注意!我正在使用带有克隆方法的数组,该方法将元素复制然后插入到数组中,然后由 ng-repeat 呈现。使用 JSON.parse(JSON.stringify(obj)) 克隆我的元素时,出现角度“重复键”错误。使用 JSON.parse(angular.toJson(obj));固定的东西。谢谢!
如果您只显示数据,您还可以使用使用双冒号 :: 的一次性绑定功能来防止更新。 ::link.title【参考方案2】:
在我的用例中(将生成的对象提供给 X2JS)推荐的方法
data = angular.toJson(source);
帮助删除$$hashKey
属性,但结果可能不再由X2JS 处理。
data = angular.copy(source);
也删除了$$hashKey
属性,但结果仍可用作 X2JS 的参数。
【讨论】:
【参考方案3】:它通常带有 ng-repeat 指令。做 dom 操作 AngularJS 用特殊 id 标记对象。
这在 Angular 中很常见。例如,如果您使用 ngResource 获取对象,您的对象将嵌入所有资源 API,您将看到 $save 等方法。使用 cookie AngularJS 也会添加属性 __ngDebug。
【讨论】:
我应该如何删除这些属性?角度是否提供任何方法来做到这一点? 如果您尝试删除该属性,Angular 模型将会中断,我建议您复制该变量。请参阅@David-Boike 关于如何过滤掉哈希键的回答【参考方案4】:如果您不想在数据中添加 id,您可以通过数组中的索引进行跟踪,这将导致项目以它们在数组中的位置而不是它们的值作为键。
像这样:
var myArray = [1,1,1,1,1];
<li ng-repeat="item in myArray track by $index">
【讨论】:
这需要假设您的物品顺序永远不会改变。 :)【参考方案5】:如果您使用的是 Angular 1.3 或更高版本,我建议您在 ng-repeat 中使用“track by”。如果您使用“track by”,Angular 不会向数组中的对象添加“$$hashKey”属性。您还可以获得性能优势,如果您的数组中的某些内容发生变化,angular 不会为您的 ng-repeat 重新创建整个 DOM 结构,而是为您的数组中已更改的值重新创建 DOM 部分。
【讨论】:
【参考方案6】:更新:从 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>
【讨论】:
只是为了澄清 - 表达式中使用的属性在重复集合中必须是唯一的。 $index 是一种选择。在大多数情况下就足够了,但有时您可能会发现通过唯一属性进行跟踪很有用。(id,...) 这需要假设您的物品顺序永远不会改变。 :)【参考方案7】:以下是您可以轻松地从对象中删除 $$hashKey 的方法:
$scope.myNewObject = JSON.parse(angular.toJson($scope.myObject))
$scope.myObject
- 指您要对其执行操作的对象,即从中删除 $$hashKey
$scope.myNewObject
- 将修改后的原始对象分配给新对象,以便在需要时使用它
【讨论】:
我觉得这太复杂了。您可以删除该单个字段 - 或以 $ 开头的每个字段。但可能您不需要 - 查看其他答案。【参考方案8】:https://www.timcosta.io/angular-js-object-comparisons/
人们第一次看到 Angular 时,它非常神奇。当您更新 JS 中的变量时,自动 DOM 更新,当有人在 DOM 中更新它的值时,相同的变量将在您的 JS 文件中更新。同样的功能适用于页面元素和控制器。
所有这一切的关键是 $$hashKey Angular 附加到 ng-repeats 中使用的对象和数组。
这个 $$hashKey 会给那些将完整对象发送到不删除额外数据的 API 的人造成很多混乱。 API 将为您的所有请求返回 400,但 $$hashKey 不会从您的对象中消失。
Angular 使用 $$hashKey 来跟踪 DOM 中的哪些元素属于在 ng-repeat 中循环的数组中的哪个项目。如果没有 $$hashKey,Angular 将无法将 javascript 或 DOM 中发生的更改应用于它们的对应项,这是 Angular 的主要用途之一。
考虑这个数组:
users = [
first_name: "Tim"
last_name: "Costa"
email: "tjsail33@gmail.com"
]
如果我们使用 ng-repeat="user in users" 将其渲染到一个列表中,其中的每个对象都会收到一个 $$hashKey 用于来自 Angular 的跟踪目的。这里有两种方法可以避免这个 $$hashKey。
【讨论】:
以上是关于什么是 $$hashKey 添加到我的 JSON.stringify 结果的主要内容,如果未能解决你的问题,请参考以下文章
我应该将 google-services.json(来自 Firebase)添加到我的存储库吗?
如果我有 3 个嵌套数据,如何将 JSON 数据添加到我的数据表中?