GroupBy 一个 RxJS Observable 成键值

GroupBy an RxJS Observable into key-values

我有以下类型为 Observable 的条目:

[{
   "id": 1,
   "name": "Testuser 1",
   "projectAccess": Role,
}] 

.json

Role {
id: string;
name:string;
}

所以要求有一个数组,其中用户是按角色分组的,我想将其作为组条目传递到通用自动完成组件中

  return data:
  [{
  manager, [{"1", "Frank"}, {"3", "Seba"}]
  },
  {employee, [{"2", "Simi"}]
  },]

任何帮助都将是appreciated.Thank你

为了实现 groupby 功能,您必须实现自己的 groupby 功能。

由于 pipe(map()) 组合,该函数在使用 observables 和简单数组之间没有区别

为了实现这个问题与此非常相似question 此处列出的算法生成一个对象,其中对象的键是分组的 属性,值是列表中的出现次数。

示例代码

私有 testUser:Observable<用户[]>

this.testuser.pipe(map((value)=>{
   return groupBy(value);
}))



groupBy(user[]) {
  let groupped=xs.reduce(function(rv, x) {
    (rv[x.ProjectAccess.Name] = rv[x.ProjectAccess.Name] || []).push(x);
    return rv;
  }, {});

  let returnList=[];

  for(let i in groupped){
   returnList.push({role:i,value:groupped[i]})
  }
};

Rxjs reduce 应该适用

const {of} = rxjs;
const {reduce} = rxjs.operators;

const data = [ {
    id: 1,
    name: 'Testuser 1',
    projectAccess: {id: 1, name: 'manager'},
} ];

of(data).pipe(
    reduce((acc, _data) => {
      for (let item of _data) {
        if (acc[item.projectAccess.name]) {
          acc[item.projectAccess.name] = [...acc[item.projectAccess.name], {[item.id]: item.name}];
        } else {
          acc[item.projectAccess.name] = [{[item.id]: item.name}];
        }
      }
      return acc;
  }, {}),
).subscribe(console.log);
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.min.js"></script>