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"
}]
}]
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>