2016-06-06 2 views
2

Как я могу перебирать объект с помощью TypeScript и иметь возможность доступа к ключу и значению?Цикл/значение объекта Loop over object с использованием TypeScript/Angular2

Мой объект JSON выглядит примерно так:

{ 
    "clients": { 
     "123abc": { 
      "Forename": "Simon", 
      "Surname": "Sample" 
     }, 
     "456def": { 
      "Forename": "Charlie", 
      "Surname": "Brown" 
     } 
    } 
} 

объект Клиенты должны быть заполнены состоит из моделей клиента выглядит как:

export class ClientModel { 
    id:string; 
    forename:string; 
    surname:string; 

    constructor(
     private id:string, 
     private forename:string, 
     private surname:string 
    ) { 
     this.id = id; 
     this.forename = forename; 
     this.surname = surname; 
    } 
} 

ответ

6

Дано:

var a = { 
    "clients": { 
     "123abc": { 
      "Forename": "Simon", 
      "Surname": "Sample" 
     }, 
     "456def": { 
      "Forename": "Charlie", 
      "Surname": "Brown" 
     } 
    } 
}; 

class ClientModel { 
    constructor(
     private id:string, 
     private forename:string, 
     private surname:string 
    ) {} 
} 

Здесь как получить массив из ClientModel объектов:

var clientList: ClientModel[] = Object.getOwnPropertyNames(a.clients) 
    .map((key: string) => new ClientModel(key, a.clients[key].Forename, a.clients[key].Surname)); 

... а вот как получить карту от string (ID) в ClientModel:

var clientMap: { [key: string]: ClientModel } = Object.getOwnPropertyNames(a.clients) 
    .reduce((map: any, key: string) => { 
     map[key] = new ClientModel(key, a.clients[key].Forename, a.clients[key].Surname); 
     return map; 
    }, {}); 

После комментария от basarat и более пристально взглянуть на Object.keys(), Object.keys больше подходящий для использования здесь, чем Object.getOwnPropertyNames(). Разница в том, что последний возвращает также неперечислимые свойства. В этом конкретном случае он не имеет практических различий, но должен сделать код более явным. Все остальное остается прежним.

+1

Многому научитесь для разработчиков старой школы JavaScript. Большое спасибо! – Sommereder

+2

Очень сильно предпочитают 'Object.keys'. То же самое (для большинства целей http://stackoverflow.com/a/22658584/390330), проще и чаще в дикой природе – basarat

+0

@basarat Да, действительно, 'Object.keys' является более подходящим, спасибо. –