RxJs groupBy 带有一个对象数组,每个对象都有键和值数组 [英] RxJs groupBy with an array of objects each having key and values array

查看:149
本文介绍了RxJs groupBy 带有一个对象数组,每个对象都有键和值数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

<预><代码>[{ empDept:'工程',empLoc:'浦那',empName:'约翰'},{ empDept:'工程',empLoc:'孟买',empName:'哈利'},{ empDept:'人力资源',empLoc:'浦那',empName:'丹尼斯'},{ empDept: '金融', empLoc: '孟买', empName: '猫王' },]

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

<预><代码>[{键:'工程',值: [{ empDept:'工程',empLoc:'浦那',empName:'约翰'},{ empDept:'工程',empLoc:'孟买',empName:'哈利'},]},{键:'人力资源',值: [{ empDept:'人力资源',empLoc:'浦那',empName:'丹尼斯'},]},{关键:'财务',值: [{ empDept: '金融', empLoc: '孟买', empName: '猫王' },]}]

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

this.groupedEmployees$ =雇员$.pipe(groupBy(person => person.empDept),mergeMap(group => of({ key: group.key, values: group.pipe(mergeMap(x => toArray())) })),);

感谢您的帮助.

解决方案

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

import { from } from 'rxjs';import { groupBy, mergeMap, reduce, toArray } from 'rxjs/operators';const groupedEmployees$ = from([{ empDept:'工程',empLoc:'浦那',empName:'约翰'},{ empDept:'工程',empLoc:'孟买',empName:'哈利'},{ empDept:'人力资源',empLoc:'浦那',empName:'丹尼斯'},{ empDept:'金融',empLoc:'孟买',empName:'猫王'}]).管道(groupBy(person => person.empDept),合并映射(组 => 组.管道(减少((acc,cur)=> {acc.values.push(cur);返回acc;},{ 键:group.key,值:[]}))),toArray());groupedEmployees$.subscribe(console.log);

So the requirement is like: I got a array of objects (e.g. Array)

[
   { empDept: 'Engineering', empLoc: 'Pune', empName: 'John' },
   { empDept: 'Engineering', empLoc: 'Mumbai', empName: 'Harry' },
   { empDept: 'HR', empLoc: 'Pune', empName: 'Denis' },
   { empDept: 'Finance', empLoc: 'Mumbai', empName: 'Elvis' },
]

I will have a function which will accept the name of the property as a parameter, on which the employee list will be grouped. So if the input parameter value is 'empDept', then I want the result as below:

[
   {
      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' },
     ]
   }
]

I'm using the RxJs groupBy operator to achieve this. I have tried the below code, but it doesn't seem to give the desired result:

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

Appreciate your help.

解决方案

If you really want to stick with RxJS, you can use this piece of code:

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);

这篇关于RxJs groupBy 带有一个对象数组,每个对象都有键和值数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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