在Meteorjs中递归复制树

时间:2014-03-24 06:42:53

标签: javascript recursion meteor meteorite meteor-up

我正在制作一个Meteorjs应用程序,我有一个教学大纲,我想复制或克隆这个教学大纲。在我的教学大纲中有一些模块可以直到多个级别意味着mudule可以有另一个模块作为其子模块等等。例如我有一个模块Grammer和grammer有另一个模块名为时态和时态啊其他模块名为present past past这些将会是这样的。

tenses
    past
        simple
        negative
        interogative
    present
        simple
        negative
        interogative
    future
        simple
        negative
        interogative

数据库字段是                         名称,                         PARENT_ID,                         有孩子,                         syllabus_id 这些mudules可以进一步有一些子模块或儿童。 在数据库中检查模块是否还有其他子节点我有一个字段布尔has_childrenparent_id来将子节点与父节点关联。如果元素是根元素,它的父节点将为空

为此我试图递归地到达每个元素,但我只能在一个级别达到一个元素。意味着我没有接触到一个元素的兄弟姐妹而是孩子们。

我的代码是:

cloneSyllabus:function(syllabi_id){
    syll_obj=Meteor.syllabi.findOne({_id:syllabi_id});
    new_syllabi_id=Meteor.syllabi.insert({

                                        subject_id:syll_obj.subject_id,
                                        level_id:syll_obj.level_id,
                                    });
    var parent_objs = Meteor.collecton.find({
                                              parent_id:null, 
                                              syllabus_id:syllabi_id}).fetch()

    for(var i=0;i<syll_design_objs.length;i++){
        makeClone(parent[i],null,new_syllabi_id)    
    }
}

和递归创建对象的另一个函数是

function makeClone(item,parent_id,syllabi_id){
    var item_id=item._id
    delete item._id
    item.parent_id=parent_id
    item.syllabus_id=syllabi_id
    var new_parent_id=Meteor.syllabi_design.insert(item)
    if(item.has_children){
        child_items=Meteor.collection.find({parent_id:item_id}).fetch();
        for(i=0;i<child_items.length;i++){
            makeClone(child_items[i],item_id,syllabi_id);
        }
    }
}

但是使用这个我能够只检索同一级别的一个元素而不是它的兄弟姐妹。 我将能够创造     时态         过去             简单             负             interogative 告诉我们在检索这些物品时我犯了什么错误。或者告诉我其他任何事情来完成任务。 在这里,我只需要更改syllabus_id并再次创建所有对象。

1 个答案:

答案 0 :(得分:1)

代码中的一切都很完美,只需在代码中添加递归函数终止语句即可。     cloneSyllabus:功能(syllabi_id){     syll_obj = Meteor.syllabi.findOne({_ ID:syllabi_id});     new_syllabi_id = Meteor.syllabi.insert({

                                    subject_id:syll_obj.subject_id,
                                    level_id:syll_obj.level_id,
                                });
var parent_objs = Meteor.collecton.find({
                                          parent_id:null, 
                                          syllabus_id:syllabi_id}).fetch()

for(var i=0;i<syll_design_objs.length;i++){
    makeClone(parent[i],null,new_syllabi_id)    
}
return 
}

并在函数i的循环中将变量var i声明为child_objs并将var child_objs声明为makeClone,因为这些变量在此处被视为glabal代码中的变量。

function makeClone(item,parent_id,syllabi_id){
    var item_id=item._id
    delete item._id
    item.parent_id=parent_id
    item.syllabus_id=syllabi_id
    var new_parent_id=Meteor.syllabi_design.insert(item)
    if(item.has_children){
        child_items=Meteor.collection.find({parent_id:item_id}).fetch();
        for(var j=0;j<child_items.length;j++){
            makeClone(child_items[i],item_id,syllabi_id);
        }
    }
    else{
        return
    }
    }     

希望这对你来说是完美的