我正在寻找一些帮助来理解这个来自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]
?