angular - 角度键值管道排序属性/按顺序迭代
问题描述
当使用 Angular键值管道迭代对象的属性时,如下所示:
<div *ngFor="let item of object | keyvalue">
{{item.key}}:{{item.value}}
</div>
我遇到了属性未按预期顺序迭代的问题。此评论表明我不是唯一遇到此问题的人:
有人可以建议在使用键值管道时确定迭代顺序的因素以及如何强制特定的迭代顺序吗?我理想的迭代顺序是添加属性的顺序。
谢谢
解决方案
根据 Angular文档,keyvalue
管道key
默认按顺序对项目进行排序。您可以提供一个比较器函数来更改该顺序,并根据对象中属性key
的、 或 输入顺序对项目进行排序。value
以下比较器函数按各种顺序对项目进行排序:
// Preserve original property order
originalOrder = (a: KeyValue<number,string>, b: KeyValue<number,string>): number => {
return 0;
}
// Order by ascending property value
valueAscOrder = (a: KeyValue<number,string>, b: KeyValue<number,string>): number => {
return a.value.localeCompare(b.value);
}
// Order by descending property key
keyDescOrder = (a: KeyValue<number,string>, b: KeyValue<number,string>): number => {
return a.key > b.key ? -1 : (b.key > a.key ? 1 : 0);
}
应用于keyvalue
管道时:
<div *ngFor="let item of object | keyvalue: originalOrder">
{{item.key}} : {{item.value}}
</div>
<div *ngFor="let item of object | keyvalue: valueAscOrder">
{{item.key}} : {{item.value}}
</div>
<div *ngFor="let item of object | keyvalue: keyDescOrder">
{{item.key}} : {{item.value}}
</div>
请参阅此 stackblitz以获取演示。
提供一个常量或null
代替有效的比较器函数可以保留对象属性的输入顺序,就像这样originalOrder
做一样,但它会导致异常(请参阅此 stackblitz):
<!-- The following syntaxes preserve the original property order -->
<div *ngFor="let item of object | keyvalue: 0">
<div *ngFor="let item of object | keyvalue: 374">
<div *ngFor="let item of object | keyvalue: null">
<!-- but they cause an exception (visible in the console) -->
ERROR TypeError: The comparison function must be either a function or undefined
此外,在模板中使用该语法两次根本不会显示项目。因此,我不会推荐它。请注意,undefined
作为比较器函数提供不会导致任何异常,但不会更改默认行为:项目按key
值排序。
推荐阅读
- python-3.x - 反向索引是否损坏?
- java - 如何处理扫描仪类中的资源泄漏问题
- typescript - 如何从 chrome 控制台运行 TypeScript 函数
- javascript - 停止从其他 keydown 处理程序传播 Material UI TextField 事件
- c++ - C++ 捕获异常后进行清理的标准方法是什么?
- azure-iot-hub - 第一次配置,物联网设备连接字符串字段永远不会出现在 Az3166 网络连接中
- jquery - jquery 不触发但返回文本
- c# - Hangfire BackgroundJob.Enqueue 和方法序列化
- firefox - Firefox Flash 设置启用/禁用
- model-view-controller - 对不在数据库 MVC 中的列进行排序