Rxjs GroupBy,Reduce以便在ID上进行透视

时间:2018-05-10 09:19:11

标签: rxjs

我正在寻找一些帮助来理解这个来自rxjs docs的例子。

Observable.of<Obj>({id: 1, name: 'aze1'},
                       {id: 2, name: 'sf2'},
                       {id: 2, name: 'dg2'},
                       {id: 1, name: 'erg1'},
                       {id: 1, name: 'df1'},
                       {id: 2, name: 'sfqfb2'},
                       {id: 3, name: 'qfs1'},
                       {id: 2, name: 'qsgqsfg2'}
                      )
        .groupBy(p => p.id, p => p.name)
        .flatMap( (group$) => group$.reduce((acc, cur) => [...acc, cur], ["" + group$.key]))
        .map(arr => ({'id': parseInt(arr[0]), 'values': arr.slice(1)}))
        .subscribe(p => console.log(p));

所以这里的目的是按id对所有项进行分组,并生成一个具有单个ID的对象和一个包含所有具有匹配ID的发出名称的values属性。

groupBy运算符的第二个参数标识返回值。有效地将发出的对象属性过滤到名称。我想通过预先映射observable可以实现同样的目的。是否可以将多个值传递给返回值参数?

我觉得非常困惑的一句是:

.flatMap( (group$) => group$.reduce((acc, cur) => [...acc, cur], ["" + group$.key]))

我知道我们现在有三个分组的可观察对象(对于3个ID),它们是有效的发射对象数组。对于每个分组可观察对象,此代码的目的是将其减少为数组,其中数组中的第一个条目是键,而数组中的后续条目是名称。

但为什么使用["" + group$.key]初始化reduce函数,而不只是[group$.key]

为什么在每次迭代时返回简化数组时会使用这三个点符号[...acc, cur]

0 个答案:

没有答案