Подтвердить что ты не робот

Как итерации ключей объектов с помощью * ngFor

Я хочу повторить [объект объекта] с помощью * ngFor в Angular 2.

Проблема заключается в том, что объект не является массивом объекта, а объектом объекта, который содержит дополнительные объекты.

{

  "data": {
    "id": 834,
    "first_name": "GS",
    "last_name": "Shahid",
    "phone": "03215110224",
    "role": null,
    "email": "[email protected]",
    "picture": **{ <-- I want to get thumb: url but not able to fetch that**
      "url": null,
      "thumb": {
        "url": null
      }
    },
    "address": "Nishtar Colony",
    "city_id": 2,
    "provider": "email",
    "uid": "[email protected]"
  }
}

Я знаю, что мы можем использовать pipe для итерации объекта, но как мы можем итератировать дальше от объекта к объекту, значит data- > picture- > thum: url.

4b9b3361

Ответ 1

Угловой 6.0.0

https://github.com/angular/angular/blob/master/CHANGELOG.md#610-2018-07-25

представил KeyValuePipe

Смотрите также https://angular.io/api/common/KeyValuePipe

@Component({
  selector: 'keyvalue-pipe',
  template: '<span>
    <p>Object</p>
    <div *ngFor="let item of object | keyvalue">
      {{item.key}}:{{item.value}}
    </div>
    <p>Map</p>
    <div *ngFor="let item of map | keyvalue">
      {{item.key}}:{{item.value}}
    </div>
  </span>'
})
export class KeyValuePipeComponent {
  object: {[key: number]: string} = {2: 'foo', 1: 'bar'};
  map = new Map([[2, 'foo'], [1, 'bar']]);
}

оригинал

Вы можете использовать трубу

@Pipe({ name: 'keys',  pure: false })
export class KeysPipe implements PipeTransform {
    transform(value: any, args: any[] = null): any {
        return Object.keys(value)//.map(key => value[key]);
    }
}
<div *ngFor="let key of objs | keys">

Смотрите также Как перебирать ключи объекта используя * ngFor?

Ответ 2

Я думаю, что самый элегантный способ сделать это - использовать javascript Object.keys вот так:

в Компоненте передайте Объект в шаблон:

Object = Object;

затем в шаблоне:

<div *ngFor="let key of Object.keys(objs)">
   my key: {{key}}
   my object {{objs[key] | json}} <!-- hier I could use ngFor again with Object.keys(objs[key]) -->
</div>

Ответ 3

Вам нужно создать пользовательский канал.

import { Injectable, Pipe } from '@angular/core';
@Pipe({
   name: 'keyobject'
})
@Injectable()
export class Keyobject {

transform(value, args:string[]):any {
    let keys = [];
    for (let key in value) {
        keys.push({key: key, value: value[key]});
    }
    return keys;
}}

И затем используйте его в своем * ngFor

*ngFor="let item of data | keyobject"

Ответ 4

Я знаю, что на этот вопрос уже дан ответ, но у меня есть одно решение для этого же.

Вы также можете использовать Object.keys() внутри *ngFor чтобы получить требуемый результат.

Я создал демо на стекблиц. Я надеюсь, что это поможет/руководство для вас/других.

КОД СНИПЕТТ

HTML-код

<div *ngFor="let key of Object.keys(myObj)">
  <p>Key-> {{key}} and value is -> {{myObj[key]}}</p>
</div>

Код файла .ts

Object = Object;

myObj = {
    "id": 834,
    "first_name": "GS",
    "last_name": "Shahid",
    "phone": "1234567890",
    "role": null,
    "email": "[email protected]",
    "picture": {
        "url": null,
        "thumb": {
            "url": null
        }
    },
    "address": "XYZ Colony",
    "city_id": 2,
    "provider": "email",
    "uid": "[email protected]"
}

Ответ 5

1. Создайте пользовательский канал, чтобы получить ключи.

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'keys'
})
export class KeysPipe implements PipeTransform {

  transform(value: any, args?: any): any {
    return Object.keys(value);
  }
}
  1. В угловом файле шаблона вы можете использовать * ngFor и перебирать свой объектный объект
<div class ="test" *ngFor="let key of Obj | keys">
    {{key}}
    {{Obj[key].property}
<div>

Ответ 6

Если вы используете оператор map() в своем ответе, вы можете связать с ним оператор toArray()... тогда вы должны иметь возможность итерации по вновь созданному массиву... по крайней мере, что сработало для меня:)

Ответ 7

В Angular теперь есть тип итеративного Object для этого сценария, который называется Set. Это соответствовало моим потребностям, когда я нашел этот вопрос в поиске. Вы создаете набор, "добавляете" к нему, как "толкаете" в массив, и помещаете его в ngFor, как массив. Нет труб или что-нибудь.

this.myObjList = new Set();

...

this.myObjList.add(obj);

...

<ul>
   <li *ngFor="let object of myObjList">
     {{object}}
   </li>
</ul>

Ответ 8

Используйте индекс:

<div *ngFor="let value of Objects; index as key">

Использование:

{{key}} -> {{value}}

Ответ 9

Я сделал бы это:

<li *ngFor="let item of data" (click)='onclick(item)'>{{item.picture.url}}</li>