简体   繁体   中英

Convert one JSON structure to another in JavaScript

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM