这是关于我在工作中发现的一个有趣问题。
如果你还不知道。我在谈论Angular 2 +
问题
因此,您希望显示列表的标记,此列表的值来自后端,并且由于某种原因而不是您收到类似的旧对象数组。
{
"car" :
{
"color" : "red",
"model" : "2013"
},
"motorcycle":
{
"color" : "red",
"model" : "2016"
},
"bicycle":
{
"color" : "red",
"model" : "2011"
}
}
然后您尝试使用* ngFor,但会显示一条错误消息:
Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.
你可能会在后端修复它,所以你得到一个对象数组,但是没有时间没有时间。你不担心孩子,我有我们。
答案 0 :(得分:49)
在Angular 6.1中引入了KeyValuePipe,它允许您迭代对象属性:
<div *ngFor="let item of object | keyvalue">
{{item.key}}:{{item.value}}
</div>
答案 1 :(得分:16)
我不知道这是否安全,但对于这些简单的情况我不喜欢管道解决方案,所以我通常使用:
<div *ngFor="let k of objectKeys(yourObject)">
{{yourObject[k].color}}
</div>
并在控制器中:
objectKeys(obj) {
return Object.keys(obj);
}
这是一个非常常见的情况,我不明白为什么没有像Angular.js 1.x
这样的标准实现答案 2 :(得分:10)
更好的解决方案是使用像这样的管道:
import { Pipe, PipeTransform } from '@angular/core';
/**
* Convert Object to array of keys.
*/
@Pipe({
name: 'appProperties'
})
export class PropertiesPipe implements PipeTransform {
transform(value: {}): string[] {
if (!value) {
return [];
}
return Object.keys(value);
}
}
然后在你的模板中:
<div *ngFor="let property of response | appProperties">
<div *ngFor="let item of response[property]">
{{item.something}}
</div>
</div>
答案 3 :(得分:2)
<div *ngFor="let item of donation_list | keyvalue">
<div class="donation-box">
<Label class="donation-label">Date : {{item.value.PaymentDate}}</Label>
<Label class="donation-label">Time : {{item.value.PaymentTime}}</Label>
</div>
</div>
如果对象内部具有更多属性,则可以这样使用。
答案 4 :(得分:1)
解决方案
在一个完美的世界里,你会得到一系列物体,因为世界并不总是完美的。你想要做的是将所有这些对象存储在一个数组中。这是一个简单易用的JavaScript解决方案。
第1步。获取所有对象键。使用Object.keys。此方法返回给定对象自己的可枚举属性的数组。
第2步。创建一个空数组。这是所有属性都将存在的地方,因为你的新ngFor循环将指向这个数组,我们必须全部捕获它们。
第3步。迭代抛出所有密钥,并将每个密钥推入您创建的阵列。
以下是代码中的样子。
// Evil response in a variable. Here are all my vehicles.
let evilResponse = {
"car" :
{
"color" : "red",
"model" : "2013"
},
"motorcycle":
{
"color" : "red",
"model" : "2016"
},
"bicycle":
{
"color" : "red",
"model" : "2011"
}
}
// Step 1. Get all the object keys.
let evilResponseProps = Object.keys(evilResponse);
// Step 2. Create an empty array.
let goodResponse = [];
// Step 3. Iterate throw all keys.
for (prop of evilResponseProps) {
goodResponse.push(evilResponseProps[prop]);
}
然后你可以将goodResponse分配给你试图首先迭代的类属性。
那是所有人。
答案 5 :(得分:0)
使用Object.values从对象中获取常规数组。 Object.keys似乎是很多不必要的工作。
参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values