2016-12-28 102 views
1

我使用Object.assign將屬性添加到可觀察陣列使用Object.assign與可觀察陣列

掙扎找出正確的運營商將屬性添加到所述陣列的每一個對象的每個元素。例如,在這種情況下,名稱字段被不恰當地用於等級。

實施例:

let x = Observable.of({id: 1, name: first grader}, {id: 2, name: second grader}) 

// current solution using flatmap and then re-configuring as array 
x 
.flatMap(res => res.map(student => Object.assign({}, student, {grade: student.name}))) 
.toArray() 

上面的例子的工作原理,但似乎很奇怪...因爲我flatmapping,然後重新構成陣列。有更好的操作者/方法來減少步驟嗎?

如果我只是在最初的observable上使用Object.assign,我得到: Object {0:Object,1:Object},它是對象的對象而不是對象的數組。

回答

1

上面的例子作品,但似乎很奇怪......因爲我flatmapping和 然後再 - 構造數組。有沒有更好的操作者/方法 來減少步驟?

如果您的數據已經可以作爲一個數組,然後你可以自己發生變異,整個陣列:

Rx.Observable.of([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) 
    .map(students => { 
    // note - this map below is Array.prototype.map, not Rx 
    return students.map(student => Object.assign({}, student, {grade: student.name})); 
    }) 
    .subscribe(x => console.log(x)); 

不過的Rx真正的亮點在收到您的數據異步:

Rx.Observable.from([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) /* stream of future student data elements */ 
    .map(student => Object.assign({}, student, {grade: student.name})) 
    .toArray() // combine your complete stream when completed into a single array emission 
    .subscribe(x => console.log(x)); 

toArray()是一個效用函數,用於等待完成,然後返回數組中所有發射的元素作爲第一個(也是最後一個)發射。

1

如果您按原樣運行code,則會失敗。因爲如果您將多個對象傳遞給Observable.of,它會將它們逐一推送到流中。

所以我假設你的意思是

Rx.Observable.of([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) 

音符的方括號。

達到你想要什麼,你可以使用map操作:

Rx.Observable.of([{id: 1, name: 'first grader'}, {id: 2, name: 'second grader'}]) 
     .map(res => res.map(student => Object.assign({}, student, {grade: student.name}))) 
     .subscribe(x => console.log(x)); 

jsBin