-2

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"}
    ]
  }
}
Daniel_Knights
  • 7,940
  • 4
  • 21
  • 49
Gaurav
  • 259
  • 4
  • 16
  • Please share the solution you *attempted* so that the community can help you to fix the issue you are facing – Asnim P Ansari Feb 12 '21 at 07:47
  • This is an annoying thing even for me. You have to iterate. Second I think there is a util library for this in GitHub. Dont remember. But you can try something like this. https://stackoverflow.com/questions/23013573/swap-key-with-value-json – Gary Feb 12 '21 at 07:49

3 Answers3

1

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);
gorak
  • 5,233
  • 1
  • 7
  • 19
1

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
        });
    }
}
Valentin Vignal
  • 6,151
  • 2
  • 33
  • 73
1

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)
Daniel_Knights
  • 7,940
  • 4
  • 21
  • 49