我使用Object.assign为Observable Array的每个元素添加属性
苦苦挣扎找出正确的运算符,为数组的每个对象添加一个属性。例如,在这种情况下,名称字段被不恰当地用于评分。
示例:
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()
上面的例子有效,但看起来很奇怪......因为我正在平面图然后重新构建数组。是否有更好的操作员/方法来减少步骤?
如果我只是在初始的observable上使用Object.assign,我得到: Object {0:Object,1:Object},它是对象的对象而不是对象数组。
答案 0 :(得分: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
答案 1 :(得分:1)
上面的例子有效,但看起来很奇怪...因为我是平面图和 然后重新构成阵列。是否有更好的操作员/方法 减少步骤?
如果您的数据已经作为数组提供,那么您可以自己改变整个数组:
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()
是一个实用函数,用于等待完成,然后将数组中所有发出的元素作为第一个(也是最后一个)发射返回。