【问题标题】:Node.js - Convert flat json to hierarchical json without 'parent','child' attributesNode.js - 将平面 json 转换为没有“父”、“子”属性的分层 json
【发布时间】:2015-04-28 13:40:25
【问题描述】:

我想从我的 sql 查询中构建分层数据结构。 在遵循this post 从平面对象构建分层 JSON 对象之后,我尝试在对象级别创建具有更多属性的 4 级层次结构,但不需要 children 属性。

我该怎么做?

这是我的 JavaScript (NodeJS) 代码:

var levels = ["counties_id","district_id", "municipalities_id", "institutes_id"];
data.forEach(function(d){
    var depthCursor = newData.counties;
    levels.forEach(function( property, depth ){
        var index;
        depthCursor.forEach(function(child,i){
            if ( d[property] == child.counties_id ) index = i;
        });
        if ( isNaN(index) ) {
            var propname = levels[depth];
            var obj = {};
            obj[propname] = d[property];
            obj["children"] = [];
            depthCursor.push(obj);
            index = depthCursor.length - 1;
        }
        depthCursor = depthCursor[index].children;
        if ( depth === levels.length - 1 ) {
            depthCursor.push({ id : d.id, name : d.name, name_H : d.name_h });
        }
    });
});

一级没问题,因为这个等式检查相同的一级属性:

if ( d[property] == child.counties_id ) index = i;

我如何检查第 2、第 3 和第 4 级相同的情况?

这是不断尝试的扁平物体:

[
{
"counties_h":"Megye 1",
"counties_en":"Coun 1",
"counties_id":"1",
"district_h":"Korz 1",
"district_en":"Dist 1",
"district_id":"101",
"municipalities_h":"Onk 1",
"municipalities_en":"Mun 1",
"municipalities_id":"asdf",
"institutes_h":"Int 1",
"institites_en":"Inst 1",
"institutes_id":"1"
},
{
"counties_h":"Megye 1",
"counties_en":"Coun 1",
"counties_id":"1",
"district_h":"Korz 1",
"district_en":"Dist 1",
"district_id":"101",
"municipalities_h":"Onk 1",
"municipalities_en":"Mun 1",
"municipalities_id":"asdf",
"institutes_h":"Int 2",
"institites_en":"Inst 2",
"institutes_id":"2"
},
{
"counties_h":"Megye 1",
"counties_en":"Coun 1",
"counties_id":"1",
"district_h":"Korz 1",
"district_en":"Dist 1",
"district_id":"101",
"municipalities_h":"Onk 2",
"municipalities_en":"Mun 2",
"municipalities_id":"sdfg",
"institutes_h":"Int 1",
"institites_en":"Inst 1",
"institutes_id":"1"
},
{
"counties_h":"Megye 1",
"counties_en":"Coun 1",
"counties_id":"1",
"district_h":"Korz 1",
"district_en":"Dist 1",
"district_id":"101",
"municipalities_h":"Onk 2",
"municipalities_en":"Mun 2",
"municipalities_id":"sdfg",
"institutes_h":"Int 2",
"institites_en":"Inst 2",
"institutes_id":"2"
},
{
"counties_h":"Megye 1",
"counties_en":"Coun 1",
"counties_id":"1",
"district_h":"Korz 2",
"district_en":"Dist 2",
"district_id":"102",
"municipalities_h":"Onk 1",
"municipalities_en":"Mun 1",
"municipalities_id":"dfgh",
"institutes_h":"Int 1",
"institites_en":"Inst 1",
"institutes_id":"1"
},
{
"counties_h":"Megye 1",
"counties_en":"Coun 1",
"counties_id":"1",
"district_h":"Korz 2",
"district_en":"Dist 2",
"district_id":"102",
"municipalities_h":"Onk 1",
"municipalities_en":"Mun 1",
"municipalities_id":"dfgh",
"institutes_h":"Int 2",
"institites_en":"Inst 2",
"institutes_id":"2"
},
{
"counties_h":"Megye 2",
"counties_en":"Coun 2",
"counties_id":"2",
"district_h":"Korz 2",
"district_en":"Dist 2",
"district_id":"202",
"municipalities_h":"Onk 1",
"municipalities_en":"Mun 1",
"municipalities_id":"fghj",
"institutes_h":"Int 1",
"institites_en":"Inst 1",
"institutes_id":"1"
},
{
"counties_h":"Megye 2",
"counties_en":"Coun 2",
"counties_id":"2",
"district_h":"Korz 2",
"district_en":"Dist 2",
"district_id":"202",
"municipalities_h":"Onk 1",
"municipalities_en":"Mun 1",
"municipalities_id":"fghj",
"institutes_h":"Int 2",
"institites_en":"Inst 2",
"institutes_id":"2"
}
]

我当前代码的输出:

{
   "counties":[
      {
         "counties_id":"1",
         "children":[
            {
               "district_id":"101",
               "children":[
                  {
                     "municipalities_id":"asdf",
                     "children":[
                        {
                           "institutes_id":"1",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"101",
               "children":[
                  {
                     "municipalities_id":"asdf",
                     "children":[
                        {
                           "institutes_id":"2",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"101",
               "children":[
                  {
                     "municipalities_id":"sdfg",
                     "children":[
                        {
                           "institutes_id":"1",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"101",
               "children":[
                  {
                     "municipalities_id":"sdfg",
                     "children":[
                        {
                           "institutes_id":"2",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"102",
               "children":[
                  {
                     "municipalities_id":"dfgh",
                     "children":[
                        {
                           "institutes_id":"1",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"102",
               "children":[
                  {
                     "municipalities_id":"dfgh",
                     "children":[
                        {
                           "institutes_id":"2",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            }
         ]
      },
      {
         "counties_id":"2",
         "children":[
            {
               "district_id":"202",
               "children":[
                  {
                     "municipalities_id":"fghj",
                     "children":[
                        {
                           "institutes_id":"1",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"202",
               "children":[
                  {
                     "municipalities_id":"fghj",
                     "children":[
                        {
                           "institutes_id":"2",
                           "children":[
                              {

                              }
                           ]
                        }
                     ]
                  }
               ]
            }
         ]
      }
   ]
}

这就是我想要的:

{
   "counties":[
      {
         "counties_id":"1",
         "counties_h":"Megye 1",
         "counties_en":"Coun 1",
         "districts":[
            {
               "district_id":"101",
               "district_h":"Korz 1",
               "district_en":"Dist 1",
               "municipalities":[
                  {
                     "municipalities_id":"asdf",
                     "municipalities_h":"Onk 1",
                     "municipalities_en":"Mun 1",
                     "institutes":[
                        {
                           "institutes_id":"1",
                           "institutes_h":"Int 1",
                           "institutes_en":"Inst 1"
                        },
                        {
                           "institutes_id":"2",
                           "institutes_h":"Int 2",
                           "institutes_en":"Inst 2"
                        }
                     ]
                  },
                  {
                     "municipalities_id":"sdfg",
                     "municipalities_h":"Onk 2",
                     "municipalities_en":"Mun 2",
                     "institutes":[
                        {
                           "institutes_id":"3",
                           "institutes_h":"Int 1",
                           "institutes_en":"Inst 1"
                        },
                        {
                           "institutes_id":"4",
                           "institutes_h":"Int 2",
                           "institutes_en":"Inst 2"
                        }
                     ]
                  }
               ]
            },
            {
               "district_id":"102",
               "district_h":"Korz 2",
               "district_en":"Dist 2",
               "municipalities":[
                  {
                     "municipalities_id":"dfgh",
                     "municipalities_h":"Onk 1",
                     "municipalities_en":"Mun 1",
                     "institutes":[
                        {
                           "institutes_id":"5",
                           "institutes_h":"Int 1",
                           "institutes_en":"Inst 1"
                        },
                        {
                           "institutes_id":"6",
                           "institutes_h":"Int 2",
                           "institutes_en":"Inst 2"
                        }
                     ]
                  }
               ]
            }
         ]
      },
      {
         "counties_id":"2",
         "counties_h":"Megye 2",
         "counties_en":"Coun 2",
         "districts":[
            {
               "district_id":"202",
               "district_h":"Korz 2",
               "district_en":"Dist 2",
               "municipalities":[
                  {
                     "municipalities_id":"fghj",
                     "municipalities_h":"Onk 1",
                     "municipalities_en":"Mun 1",
                     "institutes":[
                        {
                           "institutes_id":"7",
                           "institutes_h":"Int 1",
                           "institutes_en":"Inst 1"
                        },
                        {
                           "institutes_id":"8",
                           "institutes_h":"Int 2",
                           "institutes_en":"Inst 2"
                        }
                     ]
                  }
               ]
            }
         ]
      }
   ]
}

【问题讨论】:

  • JSON 应该在服务器中格式化并发送到客户端。您正在尝试的方法是一种不好的做法。
  • 这个 JSON 格式在服务器端(使用 NodeJS)和我将发送给客户端的输出。

标签: javascript json node.js templates hierarchical-data


【解决方案1】:

查看 NPM 上的 shape-json module

它会让你的生活变得更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2019-06-20
    • 2022-11-19
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多