在JavaScript中将一个JSON结构转换为另一个JSON结构



我有一个问题,试图将一个JSON结构转换为另一个。任何回应将是高度赞赏。我尝试了这个,并能够完成它,并查看了转换的各种其他选项,但我正在寻找实现它的最佳方法。

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

试试这样做:

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

当涉及到数据分组时,总是使用reduce方法。

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

您可以使用嵌套的forEach循环:

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)

最新更新