MergeMap 到 Map RxJS 打字稿

MergeMap into Map RxJS Typescript

我目前正在学习 RxJS,但还不明白。我有这个代码:

mapOfPeople = new Map<number, any>();

const people = [
  { name: 'Sue', age: 25 },
  { name: 'Joe', age: 30 },
  { name: 'Frank', age: 25 },
  { name: 'Sarah', age: 35 }
];

from(people)
  .pipe(
    groupBy(
      person => person.age,
      p => p
    ),
    mergeMap(group => zip(of(group.key), group.pipe(toArray())))
  )
  .subscribe(console.log);

此代码来自教程。

我想将输出放入给定的哈希图中。我该如何管理?我不知道。

mapOfPeople: any;

const people = [
  { name: 'Sue', age: 25 },
  { name: 'Joe', age: 30 },
  { name: 'Frank', age: 25 },
  { name: 'Sarah', age: 35 }
];

from(people)
  .pipe(
    groupBy(
      person => person.age,
      p => p
    ),
    mergeMap(group => zip(of(group.key), group.pipe(toArray())))
  )
  .subscribe(res => mapOfPeople = res /*or do whatever you want with the result*/);

更多信息:observable

我无法编译您的初始代码,而且我不确定 zip 部分在此上下文中的用途。

一种方法是使用订阅函数处理程序。目前它是 console.log - 但你可以在这里做任何格式 (arg) => void 的事情(一个从可观察对象中获取一个项目并以某种方式处理它的函数。

下面是一个将每个年龄段的人数组添加到地图中的示例:

type Person = { name: string, age: number};

const mapOfPeople = new Map<number, Person[]>();

const people = [
  { name: 'Sue', age: 25 },
  { name: 'Joe', age: 30 },
  { name: 'Frank', age: 25 },
  { name: 'Sarah', age: 35 }
];

from(people).pipe(
  groupBy(person => person.age),
  mergeMap(group => group.pipe(toArray()))
).subscribe(people => {
  // the age of any in this group of people is the key
  const { age } = people[0];

  // set as map's value for this age
  mapOfPeople.set(age, people);
});

您想在这个相当人为的示例的末尾添加一个 reduce 运算符:

from(people)
  .pipe(
    groupBy(
      person => person.age,
      p => p
    ),
    mergeMap(group => zip(of(group.key), group.pipe(toArray()))),
    reduce((acc, v) => {
      acc.set(v[0], v[1])
      return acc
    }, new Map<number, any>())
  )
  .subscribe(m => mapOfPeople = m);