RXJS groupBy Observable <Object[]> [英] RXJS groupBy Observable <Object[]>

查看:15
本文介绍了RXJS groupBy Observable <Object[]>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 entries$: Observable;:

我想按groupId对它们进行分组.我是这样试的:

and i would like to group them by groupId. I tried like this:

groupBy(books => books.map(book => book.groupId)),
 mergeMap(innerObs => innerObs.skip(1).map(books => books.map(book => book.groupTitle)));

然而,它没有用.在这种情况下,如何按 groupId 分组?(Observable)

However, it didn't work. How can I group by groupId in this case ? (Observable<Object[]>)

推荐答案

Higher-Order Observable

如果你想要一个更高阶的 observable,你实际上可以使用 groupBy rxjs 操作符.

const data = [
  {groupId: "foo", value: 1},
  {groupId: "foo", value: 3},
  {groupId: "foo", value: 5},
  {groupId: "bar", value: 42},
  {groupId: "bar", value: 1337},
];

from(data).pipe(
  groupBy(item => item.groupId)
)
  .subscribe(console.log);

这将导致一个 observable 为每个组发出一个 observable,并且在每个内部 observable 上,将发出相应的项目.

This will result in an observable which emits one observable per group, and on each of those inner observables, the corresponding items will be emitted.

如果你想要一个简单地发出组的 observable,那么这实际上与 rxjs 或其 groupBy 操作符无关.相反,这只是一个关于如何在 Javascript 中对数组进行分组的基本问题.

If instead you want an observable which simply emits the groups, then this has actually nothing to do with rxjs or its groupBy operator. Instead, it's merely a basic question about how to group an array in Javascript.

没有为此提供内置方法,但是像 lodash 这样的库带有这样的功能.您也可以手动完成:

There is no built-in method for this, but libraries like lodash come with such functions. You can also do it by hand:

const data = [
  {groupId: "foo", value: 1},
  {groupId: "foo", value: 3},
  {groupId: "foo", value: 5},
  {groupId: "bar", value: 42},
  {groupId: "bar", value: 1337},
];

const groupBy = (data, keyFn) => data.reduce((agg, item) => {
  const group = keyFn(item);
  agg[group] = [...(agg[group] || []), item];
  return agg;
}, {});

of(data).pipe(
  map(data => groupBy(data, item => item.groupId))
)
  .subscribe(console.log);

这将为整个数据集发射一次,但会发射

This will emit once for the entire data set, but will emit

{
  "foo":[
    {"groupId":"foo","value":1},
    {"groupId":"foo","value":3},
    {"groupId":"foo","value":5}
  ],
  "bar":[
    {"groupId":"bar","value":42},
    {"groupId":"bar","value":1337}
  ]
}

这篇关于RXJS groupBy Observable &lt;Object[]&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆