【问题标题】:Recursions on the tree structure in node.jsnode.js 中树结构的递归
【发布时间】:2015-02-14 06:52:11
【问题描述】:

任务是在 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);
        }); 
    };
    

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

【问题讨论】:

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


    【解决方案1】:

    如果有人感兴趣,这里是我/已经使它工作的方式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2022-09-27
      • 2016-03-18
      • 2020-07-14
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多