Search code examples
javascriptnode.jsconverters

Converting flat JSON to nested using underscore js


I'm querying some data with a couple of joins and it returns me a flat JSON Object. What I want to do is create a proper hierarchy for JSON. I explored and found out about Underscore.js after studying some more, It looked really complicated to convert it.

Below is what raw query data looks like:

"data": [
    {
        "Building_Id": 1,
        "Building_Address": "i-9 ISLAMABAD",
        "Floor_Id": 1,
        "Floor_Name": "Ground",
        "Room_Id": 1,
        "Room_Name": "Bedroom"
    },
    {
        "Building_Id": 1,
        "Building_Address": "i-9 ISLAMABAD",
        "Floor_Id": 1,
        "Floor_Name": "Ground",
        "Room_Id": 2,
        "Room_Name": "TV Lounge"
    },
    {
        "Building_Id": 1,
        "Building_Address": "i-9 ISLAMABAD",
        "Floor_Id": 3,
        "Floor_Name": "1st Floor",
        "Room_Id": 3,
        "Room_Name": "Dining Room"
    },
    {
        "Building_Id": 2,
        "Building_Address": "G-10 ISLAMABAD",
        "Floor_Id": 4,
        "Floor_Name": "Ground",
        "Room_Id": 4,
        "Room_Name": "Bedroom"
    }
]

How I want it to be:

 "data": [
    {
        "Building_Id": 1,
        "Building_Address": "i-9 ISLAMABAD",
        "Floors": [{
                  "Floor_Id": 1,
                  "Floor_Name: "Ground",
                  "Rooms" : [{
                            "Room_Id": 1,
                            "Room_Name": "Bedroom"},
                            {
                            "Room_Id": 2,
                            "Room_Name": "TV Lounge"}
                            }]
                   },
                  "Floor_Id": 3,
                  "Floor_Name: "1st Floor",
                  "Rooms" : [{
                            "Room_Id": 3,
                            "Room_Name": "Dining Room"
                            }]

    }]

Solution

  • Here's one way to do it using underscore.js:

    var flatData = {
     "data": [
        {
            "Building_Id": 1,
            "Building_Address": "i-9 ISLAMABAD",
            "Floor_Id": 1,
            "Floor_Name": "Ground",
            "Room_Id": 1,
            "Room_Name": "Bedroom"
        },
        {
            "Building_Id": 1,
            "Building_Address": "i-9 ISLAMABAD",
            "Floor_Id": 1,
            "Floor_Name": "Ground",
            "Room_Id": 2,
            "Room_Name": "TV Lounge"
        },
        {
            "Building_Id": 1,
            "Building_Address": "i-9 ISLAMABAD",
            "Floor_Id": 3,
            "Floor_Name": "1st Floor",
            "Room_Id": 3,
            "Room_Name": "Dining Room"
        },
        {
            "Building_Id": 2,
            "Building_Address": "G-10 ISLAMABAD",
            "Floor_Id": 4,
            "Floor_Name": "Ground",
            "Room_Id": 4,
            "Room_Name": "Bedroom"
        }
      ]
    };
    
    var toNested = function(data) {
      return _.map(_.groupBy(data, 'Building_Id'), function(i) {
        return {
          Building_Id: i[0].Building_Id,
          Building_Address: i[0].Building_Address,
          Floors: _.map(_.groupBy(i, 'Floor_Id'), function(j) {   
            return {
              Floor_Id: j[0].Floor_Id,
              Floor_Name: j[0].Floor_Name,
              Rooms: _.map(j, function(k) {
                return {
                  Room_Id: k.Room_Id,
                  Room_Name: k.Room_Name
                };
              })
            };
          })
        };
      });
    };
    
    var nestedData = {
      "data": toNested(flatData.data)
    };
    
    console.log(nestedData);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>