将javascript对象从一种形式转换为另一种形式

时间:2020-10-12 11:35:29

标签: javascript arrays json mapreduce

我有一个由团队名称组成的团队对象列表,由该团队报告,并提供该团队每天的状态列表,我希望将其转换为基于日期的对象列表,其中包含所有团队及其各自的状态日期。

我已经尝试过类似的操作,但效果不佳。

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"
      }
    ]
  }
]

2 个答案:

答案 0 :(得分:1)

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

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));

答案 1 :(得分:0)

我尝试了以下操作。

  let dayIndexed = {};
  let dayStatuses = [];

  teams.forEach(function(team) {
        team.statuses.forEach(function(status) {
            status.day = status.day.replace(/\//g, '');
            if(!dayIndexed[status.day]) {
                dayIndexed[status.day] = {
                    day: status.day,
                    teams: []
                };
                dayStatuses.push(dayIndexed[status.day]);
            }
    
            dayIndexed[status.day].teams.push({
                teamName: team.teamName,
                reportedBy: team.reportedBy,
                status: status.status   
            });
        });
    });
相关问题