2014-11-14 1 views
1

Таблицы для моей структуры папоккак создать структуру дерева рекурсивного JSON & запрос для него, где идентификатора = 5 в nodejs

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 для этого, , пожалуйста, помогите.

+0

какая структура вы используете - 2d массив? массив объектов? –

+0

массив объекта – pitu

ответ

0

Что-то вроде этого?

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

Edit: Или массив:

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

json должен генерировать [5,3,2,1], [4,2,1], [3,2,1], [2,1], [1] – pitu

+0

Я хочу родителя каждого ребенка jsut, как у нас есть структура папок в окнах os, c drive-> folder1-> folder2, в моем примере 1 является родительским элементом 2 &, 2 является родителем 3 и так далее, – pitu

0

Я думаю, я бы структурировать дерево, как это (с идентификаторами, где это уместно):

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

Какова ваша структура данных внутри узла что вам нужно преобразовать? Если это находится в таблице БД, то как вы получаете его в узел и как оно выглядит, как только оно есть, вы можете console.log (JSON.stringify (object, null 4)) для вывода текущей структуры

+0

да что-то вроде этого, как получить это 1 – pitu

+0

с чего вы начнете? – akaphenom

+0

Если я выберу любого родителя, тогда я должен получить все его внуки – pitu

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

добавив некоторые другие методы для чтения subdirectorys по идентификатору или Двойники и возвращение «это» вы быть в состоянии получить подкаталоги методом methodching;) симпатичный стиль OO, но я думаю, что он хороший w ау к структуре коду

Надеется, что это помогло в вашем конкретном случае

EDIT: здесь пример 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

+0

Позвольте мне попробовать это – pitu

+0

Я отредактировал свой ответ для некоторых методов прототипа - просто набрал их здесь без тестирования и синтаксического чека ... так что обратите внимание на ошибки –

+0

извините, но какой будет запрос для него, если я хочу получить запись для id = 5 – pitu

0

О проекте Я работал над руандийской НПО Solid Africa, древовидная структура была важной частью отслеживания расходов и пожертвований (ваши расходы или пожертвования принадлежали к категории, продуктам питания, специальному уходу и т. д.). Основываясь на этом опыте, я разработал tree-util node package.

Чтобы получить структуру дерева, включая некоторые удобные способы сделать это:

  1. Установите пакет с помощью следующей команды: НПХ установить древовидную UTIL

  2. Вам нужно получить данные представлены в виде JSON. Если это таблица в базе данных, простой выбор с использованием пакета узлов будет , вы получите данные как json.

  3. Постройте дерево на основе данных json, загружаемых из db.Более общий пример может быть ниже, но это может быть отрегулировано путем изменения массива элементов, которые будут данные загружаются из таблицы и установки 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);

Смежные вопросы