Typescript Convert Object to Array - 因为 *ngFor 不支持对象的迭代
Posted
技术标签:
【中文标题】Typescript Convert Object to Array - 因为 *ngFor 不支持对象的迭代【英文标题】:Typescript Convert Object to Array - because *ngFor does not supports iteration of object 【发布时间】:2017-05-18 10:10:48 【问题描述】:我不想像这样使用 for 循环将 Object 转换为 Array!如果将过程加倍并减慢应用程序的性能(我正在使用 Ionic2 和 Typescript,以及 Firebase)
for(输入数据) array.push(值);
是否有任何解决方案可以使用 *ngFor 迭代对象本身(如附图所示)。
或者我可以将此对象(如附图所示)转换为数组,以便可以在 *ngFor 中迭代。
【问题讨论】:
你可以为它创建一个自定义管道 如何为它创建自定义管道? 将 Farooq 的答案实现到自定义管道中,然后你就完成了 【参考方案1】:标准库函数Object.entries
可以为您做到这一点。 Documentation
这是一个在函数中使用 Object.entries
的示例,将 (key -> A 类型的对象) 的对象转换为 A 类型的对象列表,其属性为 name
,键作为该属性的值name
属性:
function f<A>(input: [s: string]: A ): (A & name: string)[]
return Object.entries(input)
.map(a =>
return name: a[0], ...a[1]
)
【讨论】:
【参考方案2】:从 Angular 6 开始,现在有一个键值管道运算符。只需执行以下操作:
*ngFor="let item of objectList | keyvalue"
item.key # refers to the keys (134, 135...) in your example
item.value # refers to the object for each key
【讨论】:
完美!这应该是公认的答案。正是我需要弄清楚的。谢谢! 还要考虑这个的程序化版本; 1)在app.module中注册KeyValuePipe 2)注入构造函数private keyval: KeyValuePipe
3)像这样使用它let keyvalueData = this.keyval.transform(data);
【参考方案3】:
如果不需要索引,可以使用 Object.values(yourObject) 获取内部对象的数组。
【讨论】:
【参考方案4】:只需将响应数据放在方括号内并保存在类中即可。
this.servicename.get_or_post().subscribe(data=>
this.objectList = [data]);
【讨论】:
这行不通,因为它将整个“列表”放入数组的第一个条目中,因此您会得到[0:object1: ...,object2: ...]
【参考方案5】:
在管道上添加 toArray() 对我有用。
// Import toArray function
import toArray from 'rxjs/operators';
// Generic function to consume API
searchObjects(term: string): Observable<theObject[]>
requestUrl = this.url + term;
return this.http.get<theObject[]>(requestUrl, httpOptions).pipe(
// convert object to array
toArray<theObject>()
);
【讨论】:
【参考方案6】:您可以使用 Object.keys(obj) 来获取命名索引。这将返回一个数组结构,您可以进一步使用/自定义它。用于迭代对象值的示例可能如下所示
var persons =
john: age: 23, year:2010,
jack: age: 22, year:2011,
jenny: age: 21, year:2012
获取迭代器
var resultArray = Object.keys(persons).map(function(personNamedIndex)
let person = persons[personNamedIndex];
// do something with person
return person;
);
// you have resultArray having iterated objects
【讨论】:
我不想循环播放!有什么解决方案可以直接在dom中循环吗? (否则会执行双循环!) 好吧,我对 Ionic 了解不多,但是在 Angular 中,您可以在迭代器指令上使用“(键,值)in Person”,希望它有助于您对直接操作 DOM 的担忧避免循环。 (key, value) 在 Angular2 (Typescript - ES5) 中不起作用或对象的对象无法循环!我试过没有用;( 我创建了一个例子来说明它是如何工作的。希望对你有帮助codepen.io/farooqkhan/pen/mRbMZV 感谢法鲁克。 [ng-repeat="(key, value) in persons"] 在 Angular 中运行良好,但在使用 *ngFor 的 Angular2 中 [(key, value) in persons] 不起作用! 'persons' 是对象的对象(不是数组) - 正如我在问题的附图中所示。以上是关于Typescript Convert Object to Array - 因为 *ngFor 不支持对象的迭代的主要内容,如果未能解决你的问题,请参考以下文章
Convert Vuejs Typescript Options to Composition Api 中的奇怪问题
[Ramda] Convert Object Methods into Composable Functions with Ramda
TypeScript 中 'object' 、 和 Object 之间的区别
Uncaught TypeError: Cannot convert object to primitive value