Javascript 使用基于分组的源对象数组的属性创建对象数组

Javascript 使用基于分组的源对象数组的属性创建对象数组,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个具有以下结构的对象数组: let sampleData = [ { values: { val1: 4, val2: 5, val3: 7 } , time: "1571372233234" , sum: 16 }, { values: { val1: 5, val2: 3, val3: 1 }, time: "1571372233234" , sum: 9}, { time: "14354545454", sum: 0}, {

我有一个具有以下结构的对象数组:


    let sampleData = [
      { values: { val1: 4, val2: 5, val3: 7 } , time: "1571372233234" , sum: 16 },
      { values: { val1: 5, val2: 3, val3: 1 }, time: "1571372233234" , sum: 9},
      { time: "14354545454", sum: 0},
      { time: "14354545454", sum: 0} }
    ];


我需要获取数组中每个对象中的每个键,并从中形成一个数组。基本上是根据所有对象中存在的键进行分组。如果对象没有“值”,则应在val1、val2、val3之间返回0。希望您提供帮助

生成的对象数组应如下所示:

result = [
  { name: 'val1', data: [4, 5, 0, 0] }, 
  { name: 'val2', data: [5, 3, 0, 0] }, 
  { name: 'val3', data: [7, 1, 0, 0] }
]
到目前为止,我已经尝试过:

var result = sampleData.map(value => ({ value: value.values }));
你可以使用数组。创建一个累加器,每个
valx
作为键,
{name:valx,data:[]}
作为值。循环遍历每个
值的键
并更新累加器。然后使用获取合并对象的值以获得所需的输出

const sampleData=[
{值:{val1:4,val2:5,val3:7},
{值:{val1:5,val2:3,val3:1},
{值:{val1:4,val2:7,val3:2},
{值:{val1:5,val2:1,val3:5}
];
const merged=sampleData.reduce((acc,{values})=>{
for(值中的常量名称){
acc[name]=acc[name]|{name,数据:[]}
acc[name].data.push(值[name])
}
返回acc;
}, {})
常量输出=对象值(合并)
console.log(输出)
您可以使用该数组。创建一个累加器,每个
valx
作为键,
{name:valx,data:[]}
作为值。循环遍历每个
值的键
并更新累加器。然后使用获取合并对象的值以获得所需的输出

const sampleData=[
{值:{val1:4,val2:5,val3:7},
{值:{val1:5,val2:3,val3:1},
{值:{val1:4,val2:7,val3:2},
{值:{val1:5,val2:1,val3:5}
];
const merged=sampleData.reduce((acc,{values})=>{
for(值中的常量名称){
acc[name]=acc[name]|{name,数据:[]}
acc[name].data.push(值[name])
}
返回acc;
}, {})
常量输出=对象值(合并)

console.log(输出)
一个小编辑。我已经更改了sampleData数组。我基本上是在为堆叠条形图准备数据。在你上面的回答中,我将如何处理这个问题;假设没有“values”对象,它应该在val1、val2、val3之间返回0,这样在绘制图形时,它会在一个小的编辑间隔内显示为无值。我已经更改了sampleData数组。我基本上是在为堆叠条形图准备数据。在你上面的回答中,我将如何处理这个问题;假设没有“values”对象,它应该在val1、val2、val3之间返回0,以便在绘制图形时,它将在该时间间隔内显示为无值