node.js中树结构的递归

时间:2014-12-16 02:23:40

标签: javascript node.js recursion tree functional-programming

任务是在node.js中递归构建树结构。也就是说,我使用一副幻灯片,可能还包括其他子甲板。我是函数式编程的新手,我不知道自己需要做什么。我知道,有更多高级方法来控制流程,但我想在开始时尝试以嵌套方式执行,如果可能的话。我现在拥有的:

  1. server.js调用api并使用json对象进行响应:

    router.get('/deck/tree/:rev_id', function(req, res) {       
        var Deck = require('./models/deck');
        var deck = new Deck(connection);
        deck.getTree(req.params.rev_id ,function (tree) {res.json(tree)});      
    });
    
  2. 在甲板模块中我有几个功能: 2.a获得牌组标题的功能:

    this.getTitle = function(rev_id, callback){
        var sql = "SELECT title FROM ?? WHERE ?? = ?";
        var inserts = ['deck_revision', 'id', rev_id];
        sql = mysql.format(sql, inserts);
        connection.query(sql, function(err, results) {
        if (err) throw err;
    
        callback(results[0].title);
        }); 
    };
    
  3. 2.b获得"直接"的功能甲板上的孩子们:

    this.getChildren = function(acc, callback){
        acc.children = [];
        var sql = "SELECT item_id AS id, item_type AS type FROM ?? WHERE ?? = ? ORDER BY position";
            var inserts = ['deck_content', 'deck_revision_id', acc.id];
            sql = mysql.format(sql, inserts);
            connection.query(sql, function(err, results) {
                if (err) throw err;
                results.forEach(function(res_item){
                    acc.children.push({'id': res_item.id, 'type': res_item.type});
                    if (acc.children.length === results.length){
                        callback(acc);
                    }
                });
            });     
    };
    
    1. 应该补充树的功能(暂时不起作用):

      var results = [];
      this.getTree = function(id, callback) {
          var acc = {};   
          var deck = this;
          var new_slide = new Slide(connection);
          deck.getTitle(id, function (title_str) {
              acc.title = title_str;
              acc.id = id;
              acc.type = 'deck';
              deck.getChildren(acc, function(new_acc){
                  new_acc.children.forEach(function(element){
                      if (element.type === 'deck'){
      
            // I suppose the help is needed here!    
      
                          deck.getTree(element.id, function(new_element){
                              results.push(new_element);
                              if(results.length === new_acc.children.length) {
                                  callback(results);
                              }
                          });
      
                      }else{
                          new_slide.getTitle(element.id, function(title_str){
                              element.title = title_str;
                              results.push(element);
                              if(results.length === new_acc.children.length) {
                                  callback(results);
                              }
                          });
      
                      }
      

1 个答案:

答案 0 :(得分:0)

如果有人感兴趣,请点击此处我的工作原理:

 this.getChildren = function(id, callback){
    var sql = "SELECT item_id AS id, item_type AS type, position FROM ?? WHERE ?? = ? ORDER BY position";
    var inserts = ['deck_content', 'deck_revision_id', id];
    sql = mysql.format(sql, inserts);
    connection.query(sql, function(err, results) {
        if (err) throw err;
        callback(results);
    }); 
};

 this.getTree = function(id, acc, callback) {
    deck = new Deck(connection);
    var new_slide = new Slide(connection);
    deck.getTitle(id, function (title_str) {
        acc.title = title_str;
        acc.id = id;
        acc.type = 'deck';
        acc.children = [];
        deck.getChildren(acc.id, function(children){
            children.forEach(function(element){
                if (element.type === 'deck'){
                    deck.getTree(element.id, element, function(new_element){
                        acc.children[new_element.position - 1] = new_element;
                        var size = acc.children.filter(function(value) { return value !== null }).length;
                        if (size === children.length){
                            callback(acc);
                        }
                    });                            
                }
                else{
                    new_slide.getTitle(element.id, function(title_str){
                        element.title = title_str;
                        acc.children[element.position - 1] = element;
                        var size = acc.children.filter(function(value) { return value !== null }).length;
                        if(size === children.length) {
                            callback(acc);
                        }
                    });                            
                }
            });                    
        });
    });
};