我使用 Object.assign 向 Observable 数组的每个元素添加一个属性
努力找出正确的运算符来向数组的每个对象添加属性。例如,在本例中,姓名字段不适用于成绩。
示例:
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()
上面的示例有效,但看起来很奇怪......因为我正在平面映射然后重新构建数组。有没有更好的运算符(operator)/方法来减少步骤?
如果我只在初始可观察值上使用 Object.assign 我会得到: 对象{0:对象,1:对象},它是对象的对象,而不是对象的数组。
最佳答案
The above example works, but seems strange...as I'm flatmapping and then re-constituting the array. Is there a better operator/ approach to reduce the steps?
如果您的数据已经作为数组提供,那么您可以自己改变整个数组:
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()
是一个实用函数,用于等待完成,然后返回数组内的所有发出的元素作为第一次(也是最后一次)发出。
关于arrays - 将 Object.assign 与 Observable 数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371072/