0

Please I want to transform the JSON below into an array of objects. I'm pretty bad at recursion and i have struggled all day. Please help will be appreciated.

{
  "org_name":"paradise island",
  "daughters" : [
    {
      "org_name": "banana tree",
      "daughters": [
        {"org_name":"Yellow Banana"},
        {"org_name":"Brown Banana"}
      ]
    },
    {
      "org_name": "big banana tree",
      "daughters": [
        {"org_name":"green banana"},
        {"org_name":"yellow banana"},
        {
          "org_name": "Black banana",
          "daughters": [
            {"org_name": "red spider"}
          ]
        }
      ]
    }
  ]
}

I want it to be transformed as below:

[
  {id:1, name:'paradise island', parent: null},
  {id:2, name:'Banana Tree', parent: 1},
  {id:3, name:'yellow banana', parent: 2}
]

The order doesn't matter. What is important is correct id relationship as per parent to child. I intend to generate the id as UUIDs. But you can generate it anyhow you like.

twinsmaj
  • 55
  • 7
  • This should help: https://stackoverflow.com/questions/11922383/access-process-nested-objects-arrays-or-json – Felix Kling Jun 12 '18 at 00:54
  • When you say you want it to be transformed, do you want a bit of code to do it or do you want specifically the JSON you gave us to be formatted like the bottom one? – Andrew Jun 12 '18 at 00:56
  • Show us what you've tried! – Robert Moskal Jun 12 '18 at 01:00
  • sorry guys. Here's what i tried... `const uuidv4 = require('uuid/v4'); function serialize(payload) { return (function traverse(res, payload, parent) { var row = {}, uuid = '', prop; for(prop in payload) { uuid = uuidv4() if(typeof payload[prop] === 'Array') { traverse(res, payload[prop], uuid) } else { row.id = uuid row.name = payload[prop] row.parent = parent res.push(row); } } return res })(res = [], payload, parent = 'null') }` what could i be missing – twinsmaj Jun 12 '18 at 01:16

2 Answers2

0

Seems pretty straightforward, just declare a variable for an unused identifier outside of the function, have the function push the current object and to the array, and call the function on each of its daughters, if they exist:

const input={"org_name":"paradise island","daughters":[{"org_name":"banana tree","daughters":[{"org_name":"Yellow Banana"},{"org_name":"Brown Banana"}]},{"org_name":"big banana tree","daughters":[{"org_name":"green banana"},{"org_name":"yellow banana"},{"org_name":"Black banana","daughters":[{"org_name":"red spider"}]}]}]};

let nextUnusedId = 0;
const addToArr = ({ org_name: name, daughters }, parent = null, addTo = []) => {
  const id = nextUnusedId++;
  addTo.push({ id, name, parent });
  if (daughters) daughters.forEach(daughter => addToArr(daughter, id, addTo));
  return addTo;
};
console.log(
  addToArr(input)
);
CertainPerformance
  • 356,069
  • 52
  • 309
  • 320
0

Thanks to @CertainPerformance. Here's my final solution

const uuidv4 = require('uuid/v4');

function serialize(payload) {

 return (function traverse(res, payload, parent) {

  var row = {}, uuid = '', prop;

  uuid = uuidv4()
  row.id = uuid
  row.name = payload["org_name"]
  row.parent = parent
  res.push(row);

  if(payload.hasOwnProperty('daughters')){
   payload["daughters"].forEach(function(daughter) {
    traverse(res, daughter, uuid)
   })
  }

  return res

 })(res = [], payload, parent = 'null')
}
twinsmaj
  • 55
  • 7