将对象数组转换为类实例

时间:2017-08-09 13:34:34

标签: angular typescript ecmascript-6

我从php返回一个对象数组,我希望将这些数据转换为类ContentData的实例化。

我目前有以下工作,但我有一种直觉,有一种更清洁的方法来实现结果。

return this.http.post("get-content.php", urlParams)
.map(this.extractData)
.map(array => {
    let newArray = Array<ContentData>();
    array.forEach(obj => {
        newArray.push(new ContentData().deserialize(obj));
    });
    return newArray;
})
.catch(this.handleError)

private extractData(res: Response): any {
    return res.json();
}

是否有更清洁的方法,而不是像这样迭代数组数据?

来自php的回复是:

[
{"id":"1","dock_id":"46","type":"TEXT","content":"{\"text\": \"<p>test<\/p>\"}","last_updated":"2017-08-09 03:10:28","json":null},
{"id":"2","dock_id":"46","type":"TEXT","content":"{\"text\": \"<p>test test<\/p>\"}","last_updated":"2017-08-09 03:10:28","json":null}
]

预期输出为[ContentData, ContentData, ...](只是一维数组)。

(2) [ContentData, ContentData]
0 : ContentData {content: "{"text": "<p>test</p>"}", dock_id: "46", type: 0, last_updated: "2017-08-09 03:10:28"}
1 : ContentData {content: "{"text": "<p>test test</p>"}", dock_id: "46", type: 0, last_updated: "2017-08-09 03:10:28"}
length : 2

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读您的代码,您可以做几件事:

  • 使用async函数获取更具线性的代码
  • 使用.map()代替for-and-push

这样的事情:

public async fetchAndProcess(/* args */) {
  try {
    const res = await this.http.post("get-content.php", urlParams); // Assuming fetch
    const json = await res.json();
    return result = json.map(item => new ContentData().deserialize(item));
  } catch (e) { this.handleError(e); }
}

我要做的另一件事是创建静态方法ContentData.fromSerialized()或修改ContentData的构造函数以接受item。但这更多地出现在代码风格领域。