首页 > 解决方案 > 将 javascript 对象从一种形式转换为另一种形式

问题描述

我有一个团队对象列表,其中包含团队名称、报告者和该团队每天的状态列表,我想将其转换为基于日期的对象列表,其中包含所有团队及其相应日期的状态。

我已经尝试过这样的事情,但没有给出预期的结果。

teams.map(team => ({
    day: team.statuses.reduce((acc, it) => it.day),
    teams: {
        teamName: team.teamName
    }
}))



 [
   {
      "teamName":"abc",
      "reportedBy": "user1",
      "statuses":[
         {
            "day":"10/12",
            "status":"green"
         },
         {
            "day":"10/11",
            "status":"green"
         },
         {
            "day":"10/09",
            "status":"green"
         }
      ]
   },
    {
      "teamName":"xyz",
      "reportedBy": "user2",
      "statuses":[
         {
            "day":"10/12",
            "status":"red"
         },
         {
            "day":"10/11",
            "status":"red"
         },
         {
            "day":"10/09",
            "status":"red"
         }
      ]
   }

]

预期输出:

[
  {
    "day": "1012",
    "teams": [
      {
        "teamName": "abc",
        "reportedBy": "user1",
        "status": "green"
      },
      {
        "teamName": "xyz",
        "reportedBy": "user2",
        "status": "red"
      }
    ]
  },
  {
    "day": "1011",
    "teams": [
      {
        "teamName": "abc",
        "reportedBy": "user1",
        "status": "green"
      },
      {
        "teamName": "xyz",
        "reportedBy": "user2",
        "status": "red"
      }
    ]
  },
  {
    "day": "1009",
    "teams": [
      {
        "teamName": "abc",
        "reportedBy": "user1",
        "status": "green"
      },
      {
        "teamName": "xyz",
        "reportedBy": "user2",
        "status": "red"
      }
    ]
  }
]

标签: javascriptarraysjsonmapreduce

解决方案


我不认为 reduce 是这里的最佳选择。我认为最好创建一个空数组并随时填充:

let input = [
   {
      "teamName":"abc",
      "reportedBy": "user1",
      "statuses":[
         {
            "day":"10/12",
            "status":"green"
         },
         {
            "day":"10/11",
            "status":"green"
         },
         {
            "day":"10/09",
            "status":"green"
         }
      ]
   },
    {
      "teamName":"xyz",
      "reportedBy": "user2",
      "statuses":[
         {
            "day":"10/12",
            "status":"red"
         },
         {
            "day":"10/11",
            "status":"red"
         },
         {
            "day":"10/09",
            "status":"red"
         }
      ]
   }
];

let output = [];

input.forEach(team =>
{
  let name = team.teamName;
  let reporter = team.reporter
  team.statuses.forEach(status =>
  {
    let dayItem = output.find(item => item.day == status.day);
    if(dayItem == null)
    {
      let newItem = {day: status.day, teams:[{status: status.status, reportedBy: reporter, teamName: name}]};
      output.push(newItem);
    }
    else
    {
      dayItem.teams.push({status: status.status, reportedBy: reporter, teamName: name})
    }
  });
});

console.log(JSON.stringify(output));


推荐阅读