2017-09-11 2 views
0

ich einige Modelle haben, kann sagen:Wie legen Sie Objekteigenschaften nicht am selben Ort fest?

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

In meiner Funktion ich ein ein Array von Objekten aus diesem Modell zurückkehren will, aber ich kann es nach wenigen Asynchron-Anrufen nur bauen, die in dieser Funktion geschieht, so wollte ich ein leeres Array dieses Modells erklären und die relevanten Eigenschaften zuweisen, wie ich sie haben:

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 
      ... 
    } 

aber im immer diese Fehlermeldung:

ERROR TypeError: Cannot set property 'driverId' of undefined

Wie sollte ich so etwas tun?

danke !!

+0

Sie nie gesetzt 'listOfCars' auf etwas anderes als ein leeres Array' [] '. 'listOfCars = []' zu dem Zeitpunkt, zu dem Sie 'listOfCars [idIndex]' anfordern. – axlj

+0

Wie kommen diese Daten zurück? In den meisten Fällen wird Ihr Array automatisch erstellt, wenn Sie ein Array mit Daten zurückerhalten, und Sie müssen nicht erst versuchen, es zu initialisieren. – DeborahK

+0

@axlj genau, also wie kann ich es lösen? –

Antwort

2

Sie müssen die Objektinstanz am Index erstellen, auf den Sie verweisen. Sie könnten es schaffen, wenn Sie die Daten erhalten, entweder durch den Wert drückt oder es durch einen Index setzen:

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

Da Ihre Schnittstelle legt fest, dass alle Eigenschaften erforderlich sind Sie angeben, müssen sie alle, wenn das neue Objekt zu schaffen, wie Ich habe oben getan. Wenn Sie was Cars zu schaffen, mit nur ANID Sie den Rest der Eigenschaften als optional markieren:

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

es ist wichtig für mich, um die Reihenfolge zu halten, so dass ich an diesem Punkt die IDs habe, und danach werde ich einen anderen API Aufruf, etwas anderes von dieser ID zu bekommen, so muss ich den Index zu halten, sonst verstehe ich nicht, wie dies wird Arbeit .. –

+0

Sie können immer Ihren Treiber im Array mit der 'driverId' finden, die ich für einzigartig halte. Sie müssen also den Index nicht im Auge behalten. – DeborahK

+0

Eine Version hinzugefügt, die den Index verwendet, dachte ich, dass es am besten ist, sicherzustellen, dass die Array-Indizes zusammenhängend sind (wie bei Verwendung von Push), aber Sie können den Wert auch per Index setzen. –

Verwandte Themen