首页 > 解决方案 > 基于 rx.js 的属性将数组动态分离为子数组?

问题描述

我有下一个输入数组。它可以有不同的阶段。

[
  {
  "id": 1,
  "phase": "Planning",
  },
  {
  "id": 2,
  "phase": "Planning",
  },
  {
  "id": 3,
  "phase": "Done",
  }
]

基于阶段,我想将其转换为具有下一种格式的数组。

  [{title: 'Planning',
      datasets: {data: [/* 1st item will be here*/]},
               {data: [/* 2nd item will be here*/]}]},
      {title: 'Done',
          datasets: [{data: [/* 1st item will be here*/]}]
        }
      ];

我怎样才能做到这一点?

提前致谢

标签: typescriptrxjs

解决方案


不知道为什么你需要 rxjs,你可以只使用 javascript 来实现它。这是一个 ES6 实现:

let input = [
      {
      "id": 1,
      "phase": "Planning",
      },
      {
      "id": 2,
      "phase": "Planning",
      },
      {
      "id": 3,
      "phase": "Done",
      }
    ]
    
    let response = {};
    
    
    input.forEach(phaseObj=> {
    
      if(!!response[phaseObj["phase"]])
        response[phaseObj["phase"]].push({data: phaseObj})
      else
        response[phaseObj["phase"]] = [{data: phaseObj}]
    })
    
    response = Object.keys(response).map( key=> { return {title: key, datasets : response[key]}});
    console.log(response)

如果你真的坚持使用 rxjs,你可以这样做:

let response = {};

Rx.Observable.from(input).map(phaseObj=> {
  if(!!response[phaseObj["phase"]])
    response[phaseObj["phase"]].push({data: phaseObj})
  else
    response[phaseObj["phase"]] = [{data: phaseObj}]
})
  .toArray()
  .subscribe( ()=> {
    response = response = Object.keys(response).map( key=> { return {title: key, datasets : response[key]}});
    console.log(response);
  })

推荐阅读