I have a json object in NODE like this:
{
"data": [
{
"groupname": "TestGroup001",
"description": "Test Gruppe für xyz...",
"mgID": 1,
"uID": 1,
"username": "Max M.",
"email": "m.m@gmx.de"
},
{
"groupname": "TestGroup001",
"description": "Test Gruppe für xyz...",
"mgID": 1,
"uID": 98,
"username": "Susanne S.",
"email": "s.s@gmx.de"
},
{
"groupname": "TestGroup002",
"description": "Test Gruppe für abc...",
"mgID": 22,
"uID": 96,
"username": "Moritz A.",
"email": "m.a@gmx.de"
},
{
"groupname": "TestGroup002",
"description": "Test Gruppe für abc...",
"mgID": 22,
"uID": 95,
"username": "Lennart H",
"email": "l.h@gmx.de"
}
]
}
and i need it grouped by "groupname" or better by "mgID"
like that..
{
"data": [
{
"groupname": "TestGroup001",
"description": "Test Gruppe für xyz...",
"mgID": 1,
"users": [
{
"uID": 1,
"username": "Max M.",
"email": "m.m@gmx.de"
},
{
"uID": 98,
"username": "Susanne S.",
"email": "s.s@gmx.de"
}
]
},
{
"groupname": "TestGroup002",
"description": "Test Gruppe für abc...",
"mgID": 22,
"users": [
{
"uID": 96,
"username": "Moritz A.",
"email": "m.a@gmx.de"
},
{
"uID": 95,
"username": "Lennart H",
"email": "l.h@gmx.de"
}
]
}
]
}
i tried it with object.map…without success
also with object.entries…also without success
i dont need working code…just some keywords.
>Solution :
A code like this will do that:
const result = {
data: Object.values(
input.data.reduce((groups, current) => {
const { mgID, description, groupname, ...rest } = current;
if (!(mgID in groups)) {
groups[mgID] = {
mgID,
description,
groupname,
users: [],
};
}
groups[mgID].users.push(rest);
return groups;
}, {})
),
};
const input = {
data: [
{
groupname: "TestGroup001",
description: "Test Gruppe für xyz...",
mgID: 1,
uID: 1,
username: "Max M.",
email: "m.m@gmx.de",
},
{
groupname: "TestGroup001",
description: "Test Gruppe für xyz...",
mgID: 1,
uID: 98,
username: "Susanne S.",
email: "s.s@gmx.de",
},
{
groupname: "TestGroup002",
description: "Test Gruppe für abc...",
mgID: 22,
uID: 96,
username: "Moritz A.",
email: "m.a@gmx.de",
},
{
groupname: "TestGroup002",
description: "Test Gruppe für abc...",
mgID: 22,
uID: 95,
username: "Lennart H",
email: "l.h@gmx.de",
},
],
};
const result = {
data: Object.values(
input.data.reduce((groups, current) => {
const { mgID, description, groupname, ...rest } = current;
if (!(mgID in groups)) {
groups[mgID] = {
mgID,
description,
groupname,
users: [],
};
}
groups[mgID].users.push(rest);
return groups;
}, {})
),
};
console.log(result);