#javascript #node.js #converters
#javascript #node.js #конвертеры
Вопрос:
Я запрашиваю некоторые данные с помощью пары объединений, и это возвращает мне плоский JSON
объект. Что я хочу сделать, так это создать правильную иерархию для JSON
. Я исследовал и узнал о Underscore.js
после изучения еще немного, это выглядело действительно сложным для преобразования.
Ниже показано, как выглядят необработанные данные запроса:
"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"
}
]
Как я хочу, чтобы это было:
"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"
}]
}]
Ответ №1:
Вот один из способов сделать это с помощью 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>
Комментарии:
1. Спасибо, чувак! Сработало отлично
Ответ №2:
Что-то вроде этого помогло бы вам. Но нужно улучшить код для уровня room. Это выполняется до уровня здания и этажа
const _ = require('lodash');
const 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"
}
]
}
const buildings = _.groupBy(flatData.data, "Building_Id");
const nestedData = [];
for (var key in buildings) {
if (buildings.hasOwnProperty(key)) {
nestedData.push({
Building_Id: key,
Building_Address: buildings[key][0].Building_Address,
floors: _.map(buildings[key], floor => {
return {
Floor_Id: floor.Floor_Id,
Floor_Name: floor.Floor_Name,
Room_Id: floor.Room_Id,
Room_Name: floor.Room_Name
}
})
});
}
}
console.log(nestedData);