2017-01-27 12 views
0

現在、私はajax呼び出しから得たjsonに基づいてオブジェクトを作成しようとしています。オブジェクトを作成するクラスを動的に選択

{ 
    "users": [ 
     { 
      "address": { 
       "city": "testCity", 
       "houseNumber": 69, 
       "id": 1, 
       "postcode": 420, 
       "street": "testStreet" 
      }, 
      "email": "[email protected]", 
      "gender": "male", 
      "id": 3, 
      "isAdmin": false, 
      "lastname": "testLastname", 
      "prename": "testPrename", 
      "projects": [ 
       { 
        "archived": null, 
        "files": [], 
        "id": 1, 
        "name": "testProject", 
        "timestamp": "2017-01-27T20:23:06+00:00", 
        "uri": "http://localhost:2000/api/projects/1" 
       } 
      ], 
      "uri": "http://localhost:2000/api/users/3" 
     } 
    ] 
} 

私は、その入力からUser型のオブジェクトを作成するために、Userクラス内に静的メソッドを定義しました。私が探しているのは、クラスProjectおよびAddressのオブジェクトを作成し、それらをユーザークラス内の対応するフィールドに設定する方法です。

export class User { 
    public uri: string = undefined; 
    public id: number = undefined; 
    public readonly isAdmin: boolean = undefined; 

    public prename: string = undefined; 
    public lastname: string = undefined; 
    public gender: string = undefined; 
    public email: string = undefined; 
    private password: string = undefined; 

    public address: Address = undefined; 
    public projects: Project[] = undefined; 

    constructor() { 

    } 

    // Returns an array containing one or more User objects 
    public static load(res: Response): User[]{ 
     let data: Object = res.json(); 
     let users: User[] = []; 

     // Payload contains multiple Users (array) 
     if(data.hasOwnProperty('users')){ 
      let dataUsers: Object[] = data['users']; 

      for(let dataUser of dataUsers){ 
       let user = new User(); 

       for(let key in user){ 
        if(dataUser.hasOwnProperty(key)){ 
         if(typeof dataUser[key] === 'object'){ 
          // If it's an object, find the class that matches the 'content' of the object and call their load method 
          } 
         } else { 
          user[key] = dataUser[key]; 
         } 
        } 
       } 

       users.push(user); 
      } 
     // Payload contains a single User 
     } else if(data.hasOwnProperty('user')){ 
      let dataUser = data['user']; 
      let user = new User(); 

      for(let key in user){ 
       if(data.hasOwnProperty(key)){ 
        user[key] = dataUser[key]; 
       } 
      } 

      users.push(user); 
     } else { 
      users.push(new User()); 
     } 

     return users; 
    } 

一つの方法は、キーが「プロジェクト」または「アドレス」であるかどうかをチェックすることにより、住所やプロジェクトのためのオブジェクトの作成をハードコーディングすることができますが、私はより多くの「ダイナミック」を探しています:これは私が現在持っているものですそれを点にする方法。

答えて

1

ロード機能はマップに格納できます。それはこのようなものに見えるでしょう。このオブジェクトの

class Address { 
    static load(data:Object) { 
     //... 
    } 
} 

class Project { 
    static load(data:Object) { 

    } 
} 

let keyClassMap : { [id:string]: (data:Object) => any } = { 
    address: Address.load, 
    project: Project.load, 
} 

キーはあなたが興味のあるクラス定義に対応する鍵である

そして、あなたの声明の中で、あなたが行うことができます:あなたのための

if(typeof dataUser[key] === 'object'){ 
    user[key] = keyClassMap[key](dataUser[key]); 
} 
+0

感謝回答!前述のロード機能は、すべてのモデル(ユーザ、住所、プロジェクト...)で実装されています。したがって、私はコンストラクタを呼び出すことによってオブジェクトを作成するのではなく、対応するクラスの静的ロード関数を呼び出すことによって(複数のインスタンスを作成する必要がある場合に備えて)作成します。 – Lelsoos

+0

@Lelsoosはその情報で答えを更新しました – Paarth

+0

それは私に型エラーをもたらします:keyClassMap [key]は関数ではありません – Lelsoos

関連する問題