Syntax error Transform tree from DB format to JSON format in JavaScript

Transform tree from DB format to JSON format in JavaScript



Suppose, we have an array of objects like this −

const arr = [
   {"id":7,"name":"Kuwait","parentId":2},
   {"id":4,"name":"Iraq","parentId":2},
    {"id":10,"name":"Qatar","parentId":2},
   {"id":2,"name":"Middle East","parentId":1},
   {"id":3,"name":"Bahrain","parentId":2},
   {"id":6,"name":"Jordan","parentId":2},
   {"id":8,"name":"Lebanon","parentId":2},
   {"id":1,"name":"Africa/Middle East","parentId":null},       {"id":5,"name":"Israel","parentId":2},
    {"id":9,"name":"Oman","parentId":2}
];

We are required to write a JavaScript function that takes in one such array. The function should then prepare a new array that contains the objects grouped according to their parents.

Therefore, the output should look like this −

const output = [
   {"id":55,"text":"Africa/Middle East","children":[
   {"id":2,"text":"Middle East","children":
   [{"id":7,"name":"Kuwait","children":[]},
   {"id":4,"name":"Iraq","children":[]},
   {"id":10,"name":"Qatar","children":[]},
   {"id":3,"name":"Bahrain","children":[]},
   {"id":6,"name":"Jordan","children":[]},
   {"id":8,"name":"Lebanon","children":[]},
   {"id":5,"name":"Israel","children":[]},
   {"id":9,"name":"Oman","children":[]}]}
];

Example

const arr = [
   {"id":7,"name":"Kuwait","parentId":2},
    {"id":4,"name":"Iraq","parentId":2},
    {"id":10,"name":"Qatar","parentId":2},
   {"id":2,"name":"Middle East","parentId":1},
    {"id":3,"name":"Bahrain","parentId":2},
    {"id":6,"name":"Jordan","parentId":2},
   {"id":8,"name":"Lebanon","parentId":2},
    {"id":1,"name":"Africa/Middle East","parentId":null},    {"id":5,"name":"Israel","parentId":2},
    {"id":9,"name":"Oman","parentId":2} ];
const transformTree = (data, root = null) => {
   const res = [];
   const map = {};
   data.forEach((el) => {
      el.children = map[el.id] && map[el.id].children || [];
      map[el.id] = el; if (el.parentId === root) {
          res.push(el);
      }
      else {
         map[el.parentId] = map[el.parentId] || {};
         map[el.parentId].children = map[el.parentId].children || [];                map[el.parentId].children.push(el);
      };
   });
   return res;
};
console.log(JSON.stringify(transformTree(arr), undefined, 4));

Output

And the output in the console will be −

[
   { "id": 1,
      "name": "Africa/Middle East",
      "parentId": null,
      "children": [
      {
         "id": 2,
         "name": "Middle East",
         "parentId": 1,
         "children": [
            {
               "id": 7,
               "name": "Kuwait",
               "parentId": 2,
               "children": []
            },
            {
               "id": 4,
               "name": "Iraq",
               "parentId": 2,
            "children": []
         },
         {
            "id": 10,
            "name": "Qatar",
            "parentId": 2,
            "children": []
      }, {
            "id": 3,
            "name": "Bahrain",
            "parentId": 2,
            "children": []
            },
            {
               "id": 6,
               "name": "Jordan",
               "parentId": 2,
               "children": []
            }, {
                  "id": 8,
                  "name": "Lebanon",
                  "parentId": 2,
                  "children": []
            }, {
                  "id": 5,
                  "name": "Israel",
                  "parentId": 2,
                  "children": []
               }, {
                     "id": 9,
                     "name": "Oman",
                     "parentId": 2,
                     "children": []
               }
            ]
         }
      ]
   }
]
Updated on: 2020-11-21T06:47:22+05:30

461 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements