将Object.assign与Observable Array一起使用

时间:2016-12-28 23:20:18

标签: arrays rxjs

我使用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},它是对象的对象而不是对象数组。

2 个答案:

答案 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()是一个实用函数,用于等待完成,然后将数组中所有发出的元素作为第一个(也是最后一个)发射返回。