Javascript 将数据从这个数组推送到另一个数组使用最少的循环

Javascript 将数据从这个数组推送到另一个数组使用最少的循环,javascript,Javascript,我想将数据从“data2”数组配置为“dataConvert”数组 我想找到另一种优化的方法 let dataConvert = []; data2 = [ { time: "2020-7", tasks: [ { key: "p1", value: 15 }, { key: "p2", value: 13

我想将数据从“data2”数组配置为“dataConvert”数组 我想找到另一种优化的方法

let dataConvert = [];

data2 = [
{
    time: "2020-7",
    tasks: [
      {
        key: "p1",
        value: 15
      },
      {
        key: "p2",
        value: 13
      },
    ]
  },
{
    time: "2020-8",
    tasks: [
      {
        key: "p1",
        value: 16
      },
      {
        key: "p2",
        value: 19
      },
    ]
  },
{
    time: "2020-9",
    tasks: [
      {
        key: "p1",
        value: 12
      },
      {
        key: "p2",
        value: 93
      },
    ]
  }
]

let dateConvert = [], valueConvert = [];
data2.forEach(x=>{
   let date = new Date(x.time);
   if (date) {
      let getYear = date.getFullYear();
      let getMonth = date.getMonth() + 1;
      let newDate = `${getYear}-${getMonth}-1`;
      return dateConvert = [...dateConvert, newDate];
   }
})
dateConvert.unshift("x");

// get p1 p2 value
let allTasks = data2.flatMap(x => x.tasks);

 valueConvert = Object.values(allTasks.reduce((arr, item) => {
 arr[item.key] = arr[item.key] || [item.key];
 arr[item.key].push(item.value);
 return arr;
}, {}));
dataConvert = [...[dateConvert], ...valueConvert];
将数据添加到“dataConvert”数组后,“dataConvert”的格式如下:

dataConvert = [
  ["x","2020-7", "2020-8", "2020-9"],
  ["p1", 15, 16, 12],
  ["p2", 13, 19, 93]
]

我尝试使用
reduce
,我想找到另一种优化方法

let dataConvert = [];

data2 = [
{
    time: "2020-7",
    tasks: [
      {
        key: "p1",
        value: 15
      },
      {
        key: "p2",
        value: 13
      },
    ]
  },
{
    time: "2020-8",
    tasks: [
      {
        key: "p1",
        value: 16
      },
      {
        key: "p2",
        value: 19
      },
    ]
  },
{
    time: "2020-9",
    tasks: [
      {
        key: "p1",
        value: 12
      },
      {
        key: "p2",
        value: 93
      },
    ]
  }
]

let dateConvert = [], valueConvert = [];
data2.forEach(x=>{
   let date = new Date(x.time);
   if (date) {
      let getYear = date.getFullYear();
      let getMonth = date.getMonth() + 1;
      let newDate = `${getYear}-${getMonth}-1`;
      return dateConvert = [...dateConvert, newDate];
   }
})
dateConvert.unshift("x");

// get p1 p2 value
let allTasks = data2.flatMap(x => x.tasks);

 valueConvert = Object.values(allTasks.reduce((arr, item) => {
 arr[item.key] = arr[item.key] || [item.key];
 arr[item.key].push(item.value);
 return arr;
}, {}));
dataConvert = [...[dateConvert], ...valueConvert];

谢谢。

您可以使用嵌套循环并将索引存储在对象中,以便更快地访问

const
数据=[{time:“2020-7”,任务:[{key:“p1”,值:15},{key:“p2”,值:13}],{time:“2020-8”,任务:[{key:“p1”,值:16},{key:“p2”,值:19}],{time:“2020-9”,任务:[{key:“p1”,值:12},{key:“p2”,值:93}],
dataConvert=[['x']],
指数={};
data.forEach(o=>{
数据转换[0]。推送(o.time);
o、 tasks.forEach(({key,value})=>{
如果(!(输入索引))索引[key]=dataConvert.push([key])-1;
数据转换[索引[键]]。推送(值);
});
});
console.log(dataConvert)

.as console wrapper{max height:100%!important;top:0;}
几个小时前你没有问过同样的问题吗?@Barmar问题已经结束,没有人回答。当你添加代码时,我投票决定重新打开它。你应该更有耐心。如果代码有效,并且你正在寻找改进建议,那么这是一个合适的地方。但请先看。