Наблюдаемый более высокого порядка
Если вы хотите наблюдаемый более высокого порядка, вы можете использовать оператор 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);
Это приведет к тому, что наблюдаемое излучаетпо одной наблюдаемой на группу, и на каждой из этих внутренних наблюдаемых будут выбрасываться соответствующие элементы.
Наблюдаемые группы
Если вместо этого вам нужна наблюдаемая, которая просто излучает группы, то это имеетна самом деле ничего общего с rxjs или его оператором groupBy
.Вместо этого это просто основной вопрос о том, как сгруппировать массив в Javascript.
Для этого нет встроенного метода, но библиотеки, такие как lodash, поставляются с такими функциями.Вы также можете сделать это вручную:
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);
Это будет излучать один раз для всего набора данных, но будет генерировать
{
"foo":[
{"groupId":"foo","value":1},
{"groupId":"foo","value":3},
{"groupId":"foo","value":5}
],
"bar":[
{"groupId":"bar","value":42},
{"groupId":"bar","value":1337}
]
}