Я хочу получить такую таблицу:
у меня 2 объекта
users = [
{ name: 'john', age: '22' },
{ name: 'mike', age: '20' },
{ name: 'dan', age: '12' },
{ name: 'anne', age: '16' },
{ name: 'jenny', age: '42' },
]
names = [
{ name: 'john', color: 'black' },
{ name: 'mike', color: 'black' },
{ name: 'dan', color: 'red' },
{ name: 'anne', color: 'red' },
{ name: 'jenny', color: 'red' },
]
Если имя из names находится в users, я хочу, чтобы его цвет внутри таблицы был black, если нет, я хочу, чтобы это был red.
Это мой html:
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
</thead>
<tbody>
<tr *ngFor = "let user of users">
<ng-container *ngFor = "let x of names">
<ng-container *ngIf = "x.name == user.name">
<td [ngStyle] = "{ 'color': names.color }">{{ user.name }}</td>
<td [ngStyle] = "{ 'color': names.color }">{{ user.age }}</td>
</ng-container>
</ng-container>
</tr>
</tbody>
</table>
Но он не работает должным образом. Вы можете увидеть рабочий фрагмент здесь
Как я могу достичь того, чего хочу? Спасибо за уделенное время!






У вас опечатка при ссылке на color. color является свойством объекта, а не массива, через который вы проходите:
<td [ngStyle] = "{ 'color': names.color }">{{ user.name }}</td>
<td [ngStyle] = "{ 'color': names.color }">{{ user.age }}</td>
Должно быть
<td [ngStyle] = "{ 'color': x.color }">{{ user.name }}</td>
<td [ngStyle] = "{ 'color': x.color }">{{ user.age }}</td>
Вы можете либо создать метод, который извлекает цвет на основе имени (которое вы указали в своем компоненте).
getColor(name) {
return this.names.find(e => e.name === name).color;
}
и позвони с
<td [style.color] = "getColor(user.name)">{{ user.name }}</td>
<td [style.color] = "getColor(user.name)">{{ user.age }}</td>
Вам не нужен двойной цикл при таком использовании, но ему все равно нужно выполнять цикл поиска для каждой итерации.
Лучше сначала объединить два массива и использовать это
combined = [];
constructor() {
this.combined = this.users.map(e => Object.assign(e, this.names.find(x => x.name === e.name)))
}
использование
<tr *ngFor = "let user of combined">
<td [style.color] = "user.color">{{ user.name }}</td>
<td [style.color] = "user.color">{{ user.age }}</td>
</tr>
Я выбрал первый путь. Мне также пришлось добавить
if (this.names.find(e => e.name === name) != undefined) { return ... }, потому что у меня были некоторые ошибки в консоли. Спасибо.