如何建立树形结构的递归JSON和查询它,其中id = 5的NodeJS(how to create

2019-10-21 06:38发布

表我的文件夹结构

 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,请大家帮忙。

Answer 1:

像这样的事情?

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


Answer 2:

我想我会构造这样的树(ID为的适当的地方):

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

什么是你需要变换节点的内部数据结构? 如果这是在数据库表,那么你是如何得到它为节点,这是什么样子,一旦它在那里 - 你可以CONSOLE.LOG(JSON.stringify(对象,空4))输出当前结构



Answer 3:

为什么不哟做这样的:

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并返回“这个”,你将能够获得通过methodchaining subdirectorys subdirectorys;)很OO的风格,但我认为这是一个很好的方法来组织代码

希望它在你的特殊情况,帮助

编辑:这是你的methodchaining子目录的示例:

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



Answer 4:

在一个项目中,我的工作对卢旺达NGO固体非洲,树结构是跟踪的开支和捐赠的重要组成部分(您的费用或捐赠属于一类,食品类,特别护理等)。 根据这一经验,我公司开发的树UTIL节点程序包 。

为了得到一个树形结构,包括一些方便的方法做到这一点:

  1. 安装包用这个命令:NPM安装树UTIL

  2. 你需要得到表现为JSON数据。 如果是在数据库中的表,一个简单的选择使用节点程序包将让你的数据作为JSON。

  3. 构建基于从数据库加载的JSON数据树。 一个更通用的例子可以是如下所述,但是它可以通过改变项目阵列被从表中加载的数据和设定的配置的parentId的属性是“PARENT_ID”来调整

 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); 



文章来源: how to create tree structure recursive json & query for it ,where id =5 in nodejs