RxJs groupBy 带有一个对象数组,每个对象都有键和值数组

Luc*_*fer 2 rxjs angular2-observables angular

所以要求是这样的:我得到了一个对象数组(例如数组)

[
   { empDept: 'Engineering', empLoc: 'Pune', empName: 'John' },
   { empDept: 'Engineering', empLoc: 'Mumbai', empName: 'Harry' },
   { empDept: 'HR', empLoc: 'Pune', empName: 'Denis' },
   { empDept: 'Finance', empLoc: 'Mumbai', empName: 'Elvis' },
]
Run Code Online (Sandbox Code Playgroud)

我将有一个函数,该函数将接受属性名称作为参数,员工列表将根据该名称进行分组。因此,如果输入参数值为“empDept”,那么我想要的结果如下:

[
   {
      key: 'Engineering',
      values: [
         { empDept: 'Engineering', empLoc: 'Pune', empName: 'John' },
         { empDept: 'Engineering', empLoc: 'Mumbai', empName: 'Harry' },
     ]
   },
   {
      key: 'HR',
      values: [
         { empDept: 'HR', empLoc: 'Pune', empName: 'Denis' },
     ]
   },
   {
      key: 'Finance',
      values: [
        { empDept: 'Finance', empLoc: 'Mumbai', empName: 'Elvis' },
     ]
   }
]
Run Code Online (Sandbox Code Playgroud)

我正在使用 RxJs groupBy 运算符来实现这一点。我已经尝试了下面的代码,但它似乎没有给出想要的结果:

this.groupedEmployees$ = employees$.pipe(
      groupBy(person => person.empDept),
      mergeMap(group => of({ key: group.key, values: group.pipe(mergeMap(x => toArray())) })),
    );
Run Code Online (Sandbox Code Playgroud)

感谢你的帮助。

lag*_*man 8

如果你真的想坚持使用 RxJS,你可以使用这段代码:

import { from } from 'rxjs'; 
import { groupBy, mergeMap, reduce, toArray } from 'rxjs/operators';

const groupedEmployees$ = from([
  { empDept: 'Engineering', empLoc: 'Pune', empName: 'John' },
  { empDept: 'Engineering', empLoc: 'Mumbai', empName: 'Harry' },
  { empDept: 'HR', empLoc: 'Pune', empName: 'Denis' },
  { empDept: 'Finance', empLoc: 'Mumbai', empName: 'Elvis' }
]).pipe(
  groupBy(person => person.empDept),
  mergeMap(group => group
    .pipe(
      reduce((acc, cur) => {
          acc.values.push(cur);
          return acc;
        },
        { key: group.key, values: [] }
      )
    )
  ),
  toArray()
);

groupedEmployees$.subscribe(console.log);
Run Code Online (Sandbox Code Playgroud)