首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用下划线js将平面JSON转换为嵌套

使用下划线js将平面JSON转换为嵌套
EN

Stack Overflow用户
提问于 2019-03-25 01:50:01
回答 2查看 215关注 0票数 0

我使用几个连接查询一些数据,它返回一个平面JSON对象。我想要做的是为JSON创建一个合适的层次结构。经过进一步的研究,我探索并发现了Underscore.js,转换它看起来真的很复杂。

以下是原始查询数据的外观:

代码语言:javascript
复制
"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"
    }
]

我希望它是什么样子:

代码语言:javascript
复制
 "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"
                            }]

    }]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-25 02:56:21

以下是使用underscore.js完成此操作的一种方法:

代码语言:javascript
复制
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);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

票数 0
EN

Stack Overflow用户

发布于 2019-03-25 02:24:55

像这样的东西会对你有帮助。但需要改进房间级别的代码。这是在建筑物和楼层级别完成的。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55326729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档