как создать рекурсивный json древовидной структуры и запросить его, где id = 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 для этого, пожалуйста, помогите.


person pitu    schedule 14.11.2014    source источник
comment
какую структуру вы используете - массив 2d? массив объектов?   -  person Max Bumaye    schedule 14.11.2014


Ответы (4)


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

{
  "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
]
person infrared    schedule 14.11.2014
comment
json должен генерировать [5,3,2,1],[4,2,1],[3,2,1],[2,1],[1] - person pitu; 14.11.2014
comment
я хочу, чтобы родитель каждого дочернего элемента был похож на структуру папок в ОС Windows, c drive->folder1->folder2, в моем примере 1 является родителем 2 и 2 является родителем 3 и так далее, - person pitu; 14.11.2014

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

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

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

person akaphenom    schedule 14.11.2014
comment
с чего ты начинаешь? - person akaphenom; 14.11.2014
comment
если я выберу любого родителя, я должен получить всех его внуков - person pitu; 14.11.2014
comment
Вы можете получить данные из БД в Node? Вы уже решили эту часть проблемы? - person akaphenom; 14.11.2014
comment
нет, у меня этого тоже нет, я получаю неправильный набор результатов - person pitu; 14.11.2014
comment
вам нужно решить это в первую очередь. Посмотрите на node-orn2 или что-то подобное, например, ватерлинию. - person akaphenom; 14.11.2014

почему бы тебе не сделать это так:

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

добавив некоторые другие методы для чтения подкаталогов по идентификатору или simular и вернув «это», вы сможете получить подкаталоги с помощью цепочки методов;) довольно стиль 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');

или что-то в этом роде :) -безумный

person Max Bumaye    schedule 14.11.2014
comment
Я отредактировал свой ответ для некоторых методов прототипа - просто ввел их здесь без тестирования и проверки синтаксиса... так что следите за ошибками - person Max Bumaye; 14.11.2014
comment
извините, но какой запрос для этого, если я хочу получить запись для id = 5 - person pitu; 14.11.2014
comment
цикл по dir_mem -> if ( dir_mem[i].getSubDirById(5) ) return dir_mem[i].getSubDirById(5) - person Max Bumaye; 14.11.2014
comment
поиск каталога таким образом - тяжелая работа ... но если у вас нет множества запросов и сложной структуры каталогов, все в порядке .... наличие этого dir_mem не приводит к увеличению использования памяти, потому что он ссылается на объекты, а не хранение копий - person Max Bumaye; 14.11.2014
comment
выберите folderId,parentId из userFolder m, где (parentId в (выберите folderId из userFolder n, где n.folderId=m.parentId) или parentId=85) или (folderId в (выберите parentId из userFolder n, где n.parentId= m.folderId) или идентификатор_папки=85); мой запрос для него, но неправильный, здесь ссылка на идентификатор папки на id и parentId ссылается на parent_id в приведенном выше примере - person pitu; 14.11.2014
comment
О каком запросе вы говорите? - person Max Bumaye; 14.11.2014
comment
Мне явно не хватает информации - я начинаю делать предположения, что вы собираетесь nodejs -> mongodb или что-то в этом роде, или почему вы говорите о QUERY = - person Max Bumaye; 14.11.2014
comment
извините, я использую mysql с nodejs, а не mongodb - person pitu; 14.11.2014
comment
Mysql — это реляционная БД, в которой у вас есть ПОЛЯ! а не какие-либо json-структуры! какого черта вы тогда спросили, как сохранять вещи в формате json? - person Max Bumaye; 14.11.2014

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

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

  1. Установите пакет с помощью этой команды: npm install tree-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);

person Kristian Abrahamsen    schedule 28.11.2016