Lalas M
Lalas M

Reputation: 1174

How to generate a nested array of objects from an source json object

Using the value from an array of object I'm trying to generate an another array of objects with a different structure than that of the original array.

In the following example arrays you can see that from the key:value pairs the key is changing between the Source array and Result array but the values are same. I had tried some code but not worthwhile to share. What logic or method can be used in this case to generate the object structure mentioned below

Source array

[
  {
    "node": {
      "Charecter": "Hulk",
      "Publisher": "Marvel",
      "Movie": "Avengers"
    }
  },
  {
    "node": {
      "Charecter": "Wolverine",
      "Publisher": "Marvel",
      "Movie": "X-Men"
    }
  },
  {
    "node": {
      "Charecter": "Superman",
      "Publisher": "DC",
      "Movie": "Man of steel"
    }
  }
]

Result array

[
  {
    "Franchise": "Marvel",
    "Data": [
      {
        "Lead": "Hulk",
        "In": "Avengers"
      },
      {
        "Lead": "Wolverine",
        "In": "X-Men"
      }
    ]
  },
  {
    "Franchise": "DC",
    "Data": [
      {
        "Lead": "Superman",
        "In": "Man of steer"
      }
    ]
  },
]

Upvotes: 3

Views: 62

Answers (2)

Pranav C Balan
Pranav C Balan

Reputation: 115282

You can do it with Array#reduce method where group everything within an object and extract object values using Object.values method.

const data = [{"node":{"Charecter":"Hulk","Publisher":"Marvel","Movie":"Avengers"}},{"node":{"Charecter":"Wolverine","Publisher":"Marvel","Movie":"X-Men"}},{"node":{"Charecter":"Superman","Publisher":"DC","Movie":"Man of steel"}}]"

const result = Object.values(data.reduce((obj, { node: { Publisher: p, ...rest }}) => {
  // define key if not defined
  obj[p] = obj[p] || { Franchise: p, Data: [] };
  // push to the array
  obj[p].Data.push(rest);
  return obj;
}, {}));

console.log(result)

Upvotes: 2

norbitrial
norbitrial

Reputation: 15176

Using .reduce() and .find() combination you can achieve the goal.

Try the following:

const data = [{ "node": { "Charecter": "Hulk", "Publisher": "Marvel", "Movie": "Avengers" } }, { "node": { "Charecter": "Wolverine","Publisher": "Marvel","Movie": "X-Men" } }, {"node": { "Charecter": "Superman", "Publisher": "DC","Movie": "Man of steel" } }];

const result = data.reduce((a, c) => {
  const found = a.find(e => e.Franchise === c.node.Publisher);
  
  if (found) found.Data.push({ Lead: c.node.Charecter, In: c.node.Movie });
  else a.push({ Franchise: c.node.Publisher, Data: [{ Lead: c.node.Charecter, In: c.node.Movie }] });

  return a;
}, []);

console.log(result)

I hope this helps!

Upvotes: 2

Related Questions