使用rx.js根据属性将数组动态拆分为子数组吗?

时间:2018-07-11 13:45:38

标签: typescript rxjs

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

[
  {
  "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*/]}]
        }
      ];

我该怎么做?

预先感谢

2 个答案:

答案 0 :(得分:1)

不确定为什么需要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);
  })

答案 1 :(得分:0)

您可以使用groupBy运算符-它将按对象属性对数据进行分组