0

I have a json with "proceds" and "teams".

Id´like to transform it grouping it by team.

Next, I show a snippet what I want achieve.

How can I do it?

dados:{
proceds:[
 {id:'1', proc:'11', teams:[{team_id:1},{team_id:2}]},
 {id:'2', proc:'12', teams:[{team_id:1},{team_id:3}]},
 {id:'3', proc:'13', teams:[{team_id:2},{team_id:3}]},
]
}

I´d like to transform "dados" to:

dados:{
 teams:[
  {team_id:1, proceds:[{id:'1', proc:'11'},{id:'2', proc:'12'}],
  {team_id:2, proceds:[{id:'1', proc:'11'},{id:'3', proc:'13'}]
  {team_id:3, proceds:[{id:'2', proc:'12'},{id:'3', proc:'13'}]
 ]
}
0

4 Answers 4

2

You can create an object lookup for each team id and then generate the result using Object.entries and array#map.

const data = [ {id:'1', proc:'11', teams:[{team_id:1},{team_id:2}]}, {id:'2', proc:'12', teams:[{team_id:1},{team_id:3}]}, {id:'3', proc:'13', teams:[{team_id:2},{team_id:3}]}, ],
    result = Object.entries(data.reduce((r, o) => {
      o.teams.forEach(({ team_id }) => {
        r[team_id] = r[team_id] || [];
        r[team_id].push({ id: o.id, proc: o.proc });
      });
      return r;
    }, {})).map(([team_id, proceds]) => ({ team_id, proceds }));
console.log(result);
.as-console-wrapper{min-height:100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

Comments

1

You need to iterate each object to make groups.

let dados = {
proceds:[
 {id:'1', proc:'11', teams:[{team_id:1},{team_id:2}]},
 {id:'2', proc:'12', teams:[{team_id:1},{team_id:3}]},
 {id:'3', proc:'13', teams:[{team_id:2},{team_id:3}]},
]
};

const groupByTeams = [];
dados.proceds.forEach(item=> {
  let  {teams, ...teamItems} = item;
teams.forEach(team=>{
groupByTeams.find(x=>x.team_id==team.team_id)?groupByTeams.find(x=>x.team_id==team.team_id).proceds.push({...teamItems}):groupByTeams.push({...team, proceds: [{...teamItems}]});
});
});

console.log({dados:{teams:groupByTeams}});

Comments

1

You can combine reduce with Object.keys

const asObject = dados.proceds.reduce((acc, curr) => {
    curr.teams.forEach(t => acc[t.team_id] = [...(acc[t.team_id] || []), { id: curr.id, proc: curr.proc }])
    return acc
}, {})

const result = {
    teams: Object.keys(asObject).map(k => ({ team_id: k, proceds: asObject[k] }))
}

Comments

1

const dados = {
    proceds:[
     {id:'1', proc:'11', teams:[{team_id:1},{team_id:2}]},
     {id:'2', proc:'12', teams:[{team_id:1},{team_id:3}]},
     {id:'3', proc:'13', teams:[{team_id:2},{team_id:3}]},
    ]
}

function transform(object) {
    object.teams = object.proceds.map((obj) => ({
        team_id: parseInt(obj.id),
        proceds: [
            ...obj.teams.map(team => ({
                id: team.team_id.toString(),
                proc: object.proceds.find(proc => proc.id == team.team_id).proc
            }))
        ]
    }))
    delete object.proceds;
    return object; 
}

console.log(transform(dados))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.