2017-09-11 4 views
0

Je certains modèles, permet de dire:Comment définir la propriété des objets qui ne se trouve pas au même endroit?

export interface Car { 
    driverId: string; 
    driverName: string; 
    color: string; 
} 

Dans ma fonction, je veux retourner un tableau d'objets de ce modèle, mais je ne peux construire après quelques appels asynchrones qui se passe dans cette fonction, donc je voulais déclarer un tableau vide de ce modèle et affecter les propriétés pertinentes que je les ai:

public getListOfCarObjects(): Car[] { 
    let listOfCars: Car[] = []; 
    self._serviceOne.getIds().subscribe(
     (res: DriversInfo) => { 
     res.ids.map((id: string, idIndex: number) => { 
      listOfCars[idIndex].driverId = id; 
      // more stuff api calls below and building the object 
      ... 
    } 

mais im obtenir cette erreur:

ERROR TypeError: Cannot set property 'driverId' of undefined

comment, devrais-je faire quelque chose comme ça?

merci !!

+0

Vous ne remettras 'listOfCars' à quoi que ce soit autre qu'un tableau vide' [] '. 'listOfCars = []' au moment où vous demandez 'listOfCars [idIndex]'. – axlj

+0

Comment ces données reviennent-elles? Dans la plupart des cas, si vous récupérez un tableau de données, il créera automatiquement votre tableau et vous n'aurez pas besoin de l'initialiser en premier. – DeborahK

+0

@axlj exactement, alors comment puis-je le résoudre? –

Répondre

2

Vous devez créer l'instance d'objet à l'index que vous référencez. Vous pouvez créer quand vous recevez les données, que ce soit en appuyant sur la valeur ou le réglage par index:

listOfCars.push({ driverId: id, dirverName: "", color: "" }); 
listOfCars[idIndex] = { driverId: id, dirverName: "", color: "" }; 

Depuis votre interface précise que vous toutes les propriétés sont requises doivent les spécifier lors de la création du nouvel objet, comme Je l'ai fait ci-dessus. Si vous quoi créer Cars avec seulement anid vous pouvez marquer le reste des propriétés en option:

export interface Car { 
    driverId: string; 
    driverName?: string; 
    color?: string; 
} 
+0

il est important pour moi de garder l'ordre, donc à ce stade j'ai les identifiants, et après cela, je vais appeler un autre api pour obtenir quelque chose d'autre, donc je dois garder l'index, sinon je ne comprends pas travail .. –

+0

Vous pouvez toujours trouver votre pilote dans le tableau en utilisant le 'driverId', qui je suppose est unique. Vous n'avez donc pas besoin de suivre l'indice. – DeborahK

+0

Ajout d'une version qui utilise l'index, j'ai pensé qu'il était préférable de s'assurer que les index de tableau sont contigus (comme l'utiliserait push) mais vous pouvez également définir la valeur par index. –