如何通过rxjs运算符处理我从请求中获得的对象?

时间:2018-11-14 20:54:47

标签: javascript angular rxjs rxjs-pipeable-operators

我的问题是: 我如何处理从http请求获得的对象列表中的对象。例如,我收到一个对象列表,每个对象都像

{
    start:start,
    end:end,
    title:title,
}

我需要修改为

{
    start: new Date(start),
    end: new Date(end),
    title:title,
    draggable:true,
    resizable:true,
}

我的代码

this.http.get('https:url-to-guest-events').pipe(
    //what operator can i use, map maybe?
)
.subscribe(
    events => this.events = events;
)

2 个答案:

答案 0 :(得分:1)

map operator用于转换/更改流中的数据。

.pipe(
  map( original => {
    // code here to modify the original
    // be sure to call return on the result
  })
)

您可以做的绝对最简单的转换可能是:

.pipe(
  map( original => {
    return {
      start: original.start,
      end: original.end,
      title: original.title,
      draggable: true,
      resizable: true
    }
  })
)

我个人会声明一个类并设置值,但是如果您仅使用自由格式的对象/哈希,就足够了。

这是StackBlitz上的一个演示:https://stackblitz.com/edit/typescript-3mdpjo?file=index.ts&devtoolsheight=100

答案 1 :(得分:1)

map运算符与对象解构一起使用以得到最短的结果:

this.http.get('https:url-to-guest-events').pipe(
    map(({start, end, title}) => ({
        start: new Date(start),
        end: new Date(end),
        title: title,
        draggable: true,
        resizable: true,
    }))
)
.subscribe(
    events => this.events = events
)

如果您从HTTP端点接收到一个数组(由于命名为events可以假定),建议您使用mergeMaptoArray在每个项目,然后收集结果,如下所示:

this.http.get('https:url-to-guest-events').pipe(
    mergeMap(result => result),
    map(({start, end, title}) => ({
        start: new Date(start),
        end: new Date(end),
        title: title,
        draggable: true,
        resizable: true,
    })),
    toArray()
)
.subscribe(
    events => this.events = events
)

mergeMap将所有数组项流式传输为单独的通知。映射后,toArray将收集所有通知并将它们放回数组中,以方便您以后在subscribe函数中进行分配。