如何创建树结构递归json&查询它,其中id = 5在nodejs中

时间:2014-11-14 12:33:39

标签: javascript json node.js recursive-datastructures

我的文件夹结构表

 id |    name      | parent_id 
----+--------------+-----------
  1 | parent       |          
  2 | child        |         1
  3 | grandchild A |         2
  4 | grandchild B |         2
  5 | grandchild c |         3

select id,parent_id, name from table.

我想为此结果集创建一个json,它应该是树结构。 如何为此制作一个json, 请帮忙。

4 个答案:

答案 0 :(得分:0)

这样的东西?

{
  "1": {
      "name": "parent",
      "parent_id": 0
   },
  "2": {
     "name": "child",
     "parent_id": 1
  },
  "3": {
     "name": "grandchild a",
     "parent_id": 2
  }
}

编辑:或数组:

[
    { "id": 1, "name": "parent", "parent_id": 0},
    { "id": 2, "name": "child",  "parent_id": 1}
    // and so on
]

答案 1 :(得分:0)

我想我会像这样构建树(在适当的地方使用id):

{
     name: "parent"
     children: [
       {
          name: "child"
          children: [
             {
               name: "grandchild a"
              }   ,
             {
               name: "grandchild b"
              }   ,         
             {
               name: "grandchild c"
              }   
          ]   
        }
      ]
  }

您需要转换的Node内部的数据结构是什么?如果这是在一个数据库表中,那么你如何将它带入节点,一旦它在那里它会是什么样子 - 你可以使用console.log(JSON.stringify(object,null 4))来输出当前结构

答案 2 :(得分:0)

为什么不这样做:

function Directory(p_id, p_name){
  this.name = p_name;
  this.id = p_id;
  this.subdir = [];
}

Directory.prototype.addSubDir(p_directory){
  this.subdir.push(p_directory);
}

然后代码中的某处执行此操作:

var arr_struc = ...;//[your data]
var dir_mem = [];
var rootDir = new Directory(0, 'ROOT')
dir_mem.push(rootDir);

for(var i = 0; i < arr_struc.length; i++){
  var tmp_directory = new Directory(i+1, arr_struc[i].name)
  dir_mem.push(tmp_directory);
  if(!arr_struc[i].parent_id)
    { rootDir.addSubDir(tmp_directory) }
  else
    { dir_mem[arr_struc[i].parent_id].addSubDir(tmp_directory) }
}

添加一些其他方法来通过ID或simular读取子目录并返回“this”你可以通过方法链接获得子目录;)漂亮的OO样式但我认为它是一种很好的结构代码方法

希望它在您的特殊情况下有所帮助

编辑: 这是一个方法链接你的子目录的例子:

Directory.prototype.getSubDirs(){
  return this.subDir;
}
Directory.prototype.getSubDirById(p_id){
  var allSubDirs = this.getSubDirs();
  for(var i = 0; i < allSubDirs.length; i++){
    if(allSubDirs[i].id === p_id) return allSubDirs[i];
  }
  return false;
}
Directory.prototype.getSubDirByName(p_name){
  var allSubDirs = this.getSubDirs();
  for(var i = 0; i < allSubDirs.length; i++){
    if(allSubDirs[i].name === p_name) return allSubDirs[i];
  }
  return false;
}

然后你可以这样做:

rootDir.getSubDirByName('parent').getSubDirByName('child').getSubDirByName('grandchild A');

或类似的东西:) -crazy

答案 3 :(得分:0)

在我为卢旺达非政府组织Solid Africa工作的项目中,树木结构是跟踪费用和捐赠的重要部分(您的费用或捐赠属于某一类别,食品,特殊护理等)。根据这一经验,我开发了tree-util node package

要获得包含一些方便方法的树结构,请执行以下操作:

  1. 使用以下命令安装软件包: npm install tr​​ee-util

  2. 您需要将数据表示为json。 如果它是数据库中的表,则使用节点包进行简单选择 以json的形式获取数据。

  3. 根据从db加载的json数据构建树。一个更通用的示例可以在下面,但可以通过将items数组更改为从表中加载的数据并将配置的parentid属性设置为'parent_id'来进行调整

  4. var tree_util = require('tree-util')
     
    // An array where the items has a parent child reference using id properties 
    var items = [{ id : 1 }, { id : 2, parentid : 1 }, { id : 3, parentid : 1 },
                 { id : 4, parentid : 1 }, { id : 5, parentid : 3 }];
     
    // Config object to set the id properties for the parent child relation 
    var standardConfig =  { id : 'id', parentid : 'parentid'};
     
    // Creates an array of trees. For this example there will by only one tree 
    var trees = tree_util.buildTrees(items, standardConfig);