I have a problem trying to convert one JSON structure to another. Any response will be highly appreciated. I tried this and was able to get it done, and looked at various other options for converting, but I am looking for the optimal way to achieve it.
// GIVEN
{
Monday: {
Transactions: [
{Amount: 100, Status: "Cleared"},
{Amount: 200, Status: "Pending"},
{Amount: 300, Status: "Failed"}
]
},
Tuesday: {
Transactions: [
{Amount: 700, Status: "Cleared"},
{Amount: 800, Status: "Pending"},
{Amount: 900, Status: "Failed"}
]
},
Wednesday: {
Transactions: [
{Amount: 400, Status: "Cleared"},
{Amount: 500, Status: "Pending"},
{Amount: 600, Status: "Failed"}
]
}
}
// DESIRED RESULT
{
Cleared: {
Transactions: [
{Amount: 100, Day: "Monday"},
{Amount: 700, Day: "Tuesday"},
{Amount: 400, Day: "Wednesday"}
]
},
Pending: {
Transactions: [
{Amount: 200, Day: "Monday"},
{Amount: 800, Day: "Tuesday"},
{Amount: 500, Day: "Wednesday"}
]
},
Failed: {
Transactions: [
{Amount: 300, Day: "Monday"},
{Amount: 900, Day: "Tuesday"},
{Amount: 600, Day: "Wednesday"}
]
}
}
Whenever it comes to grouping of data, always use reduce
method.
const given = { Monday: { Transactions: [{Amount: 100, Status: "Cleared"}, {Amount: 200, Status: "Pending"}, {Amount: 300, Status: "Failed"}] }, Tuesday: { Transactions: [{Amount: 700, Status: "Cleared"}, {Amount: 800, Status: "Pending"}, {Amount: 900, Status: "Failed"}] }, Wednesday: { Transactions: [{Amount: 400, Status: "Cleared"}, {Amount: 500, Status: "Pending"}, {Amount: 600, Status: "Failed"}] }}; const result = Object.entries(given).reduce((a,[Day, v])=>{ v.Transactions.forEach(({Amount, Status})=>{ a[Status]??= {Transactions:[]}; a[Status].Transactions.push({Day, Amount}); }); return a; },{}); console.log(result);
Try something like that:
input = {
Monday: {
Transactions:
[{Amount: 100, Status: "Cleared"},
{Amount: 200, Status: "Pending"},
{Amount: 300, Status: "Failed"}]
},
Tuesday: {
Transactions:
[{Amount: 700, Status: "Cleared"},
{Amount: 800, Status: "Pending"},
{Amount: 900, Status: "Failed"}]
},
Wednesday: {
Transactions:
[{Amount: 400, Status: "Cleared"},
{Amount: 500, Status: "Pending"},
{Amount: 600, Status: "Failed"}]
}
}
output = {
Cleared: {
Transactions: []
},
Pending: {
Transactions: []
},
Failed: {
Transactions: []
}
}
for (const day in input) {
for (const transaction of input[day].Transactions) {
const status = transaction.Status;
output[status].Transactions.push({
Amount: transaction.Amount,
Day: day
});
}
}
You could use a nested forEach
loop:
const input = {Monday: {Transactions: [{Amount: 100,Status: "Cleared"},{Amount: 200,Status: "Pending"},{Amount: 300,Status: "Failed"}]},Tuesday: {Transactions: [{Amount: 700,Status: "Cleared"},{Amount: 800,Status: "Pending"},{Amount: 900,Status: "Failed"}]},Wednesday: {Transactions: [{Amount: 400,Status: "Cleared"},{Amount: 500,Status: "Pending"},{Amount: 600,Status: "Failed"}]}} const output = { Cleared: {Transactions: []}, Pending: {Transactions: []}, Failed: {Transactions: []} } Object.keys(input).forEach((day) => { input[day].Transactions.forEach((transaction) => { output[transaction.Status].Transactions.push(transaction) }) }) console.log(output)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.