如何在Angular 6中将多个属性映射到数组?

时间:2019-04-10 09:10:51

标签: angular rxjs rxjs-pipeable-operators

我有一个对象数组,例如:

const data: any[] = [
     { x: 1, y: 1 },
     { x: 2, y: 2 },
     { x: 3, y: 4 },
     { x: 4, y: 6 }
];

// get x as array
from(d).pipe(map(m => m.x), toArray()).subscribe(x => ...);

并希望将其映射到下面的内容以在Plotly

中使用
{
  x: [1,2,3,4],
  y: [1,2,4,6]
}

当然,我可以复制上面的管道以获取y值,但这将是不同的订阅。还有另一种解决方法吗?

3 个答案:

答案 0 :(得分:3)

与RxJS无关,它只是纯JS。

按如下所示使用reduce

const data = [
     { x: 1, y: 1 },
     { x: 2, y: 2 },
     { x: 3, y: 4 },
     { x: 4, y: 6 }
];

const plotly = data.reduce((p, n) => ({ 
  x: [...p.x, n.x], 
  y: [...p.y, n.y]
}), { 
  x: [], 
  y: []
});

console.log(plotly);

答案 1 :(得分:0)

改为使用rxjs reduce

from(this.data).pipe(
  reduce((acc, m) => {
    acc.x.push(m.x);
    acc.y.push(m.y);
    return acc
  }, {x: [], y: []})).subscribe(x => console.log(x));

https://stackblitz.com/edit/angular-gldpxy

答案 2 :(得分:0)

让我们在这里使用一些ES6魔术。我们将使用spread syntaxObject.assign。从某种意义上说,我们在某种程度上转置了这个对象数组。

const data = [
     { x: 1, y: 1 },
     { x: 2, y: 2 },
     { x: 3, y: 4 },
     { x: 4, y: 6 }
];

const result = Object.assign(...Object.keys(data[0]).map(key =>
  ({ [key]: data.map( o => o[key] ) })
));

console.log(result)