2016-06-24 10 views
1

Ich habe ein Objekt, das ich erstellen und eine Funktion für dieses Objekt, um Daten in die verschiedenen Eigenschaften zu laden. Während die Methode wie gewünscht funktioniert, habe ich das Gefühl, dass es überflüssig sein könnte. Kann dies auf prägnante oder bessere Weise erreicht werden?Kurze Möglichkeit zum Deklarieren und Laden von Objekt

var user = {   
    productLine: { 
     userActiveValue: [] 
    }, 
    id: { 
     PACT: null, 
     EDIPI: null, 
     AKO: null, 
    }, 
    name: { 
     first: null, 
     last: null, 
    }, 
    DMIS: null, 
    region: null, 
    email: null, 
    load: true, 
    loadUser: function (userInfoAPIResponse) { 
     this.id.PACT = userInfoAPIResponse.UID; 
     this.id.EDIPI = userInfoAPIResponse.EDIPN; 
     this.id.AKO = userInfoAPIResponse.akoUserID; 
     this.name.first = userInfoAPIResponse.fName; 
     this.name.last = userInfoAPIResponse.lName; 
     this.DMIS = userInfoAPIResponse.dmisID; 
     this.region = userInfoAPIResponse.RHCName; 
     this.email = userInfoAPIResponse.userEmail; 
     console.log(this); 
    } 
}; 
+0

Wenn Sie eine Konsistenz zwischen Eigenschaftsnamen in Ihrem Objekt und den Eigenschaftsnamen der von 'userInfoAPIResponse' zurückgegebenen Werte beibehalten, müssen Sie lediglich eine Schleife ausführen. Außerdem sollte 'loadUser' außerhalb des 'user'-Objekts als Erweiterung des Prototyps stehen. – Baruch

+0

Das von der API zurückgegebene Objekt stammt aus einer anderen Abteilung. Die Namenskonvention, die von dieser API kommt, unterscheidet sich von der, die wir verwenden möchten, und wir haben keine Möglichkeit, sie an ihrem Ende zu ändern. Ich wünschte, es könnte dasselbe sein. –

+0

Ich mag die Lösung von Qwertiy, aber wenn Sie bei einem Objektliteral bleiben und sicherstellen wollen, dass 'loadUser' aufgerufen wird, bevor eine Arbeit erledigt ist, können Sie die obigen Eigenschaftsdefinitionen eliminieren (außer' productLine' und 'load', da Sie ordnen diese nicht in Ihrer 'loadUser'-Funktion zu. Auf den Rest wird beim Laden der Daten geschrieben, und sie müssen nicht zuerst definiert werden. –

Antwort

5
function User(userInfoAPIResponse) { 
    this.id = { 
    PACT: userInfoAPIResponse.UID, 
    EDIPI: userInfoAPIResponse.EDIPN, 
    AKO: userInfoAPIResponse.akoUserID 
    }; 
    this.productLine = { 
    userActiveValue: [] 
    }; 
    this.name = { 
    first: userInfoAPIResponse.fName, 
    last: userInfoAPIResponse.lName 
    }; 
    this.DMIS = userInfoAPIResponse.dmisID; 
    this.region = userInfoAPIResponse.RHCName; 
    this.email = userInfoAPIResponse.userEmail; 
} 
var user = new User(...); 
+0

Gute Idee. Ich nehme an, ich würde ein undefined bekommen, wenn die Eigenschaft in diesem Fall nicht auf dem eingehenden Objekt existiert? –

+0

@IthinkIcancode, ja. Aber du handelst auf die gleiche Weise, oder? – Qwertiy

0

Abgesehen von beispielsweise unter Verwendung von user.name = {first: response.fName, last: response.lName} und so weiter, nein. Sie müssen die Variablen von einem Objekt zum anderen selbst zuordnen oder einfach die Antwort als Benutzervariable verwenden. Alternativ können Sie auch den Benutzer als globalen (oder äußeren) Gültigkeitsbereich deklarieren und die Unterobjekte in Ihrer Callback-Funktion deklarieren und setzen. Das würde bedeuten, dass Sie möglicherweise nachsehen mussten, dass sie und ihre Eltern undefiniert sind, bevor Sie sie woanders verwenden, im Gegensatz zu einem einfachen Nicht-Null-Check.

+0

Scheint Quertiy mich mit einer umfassenderen Antwort zu schlagen – Alpvax

Verwandte Themen