繁体   English   中英

在Meteorjs中递归复制树

[英]Copy a tree recursively in Meteorjs

我正在一个Meteorjs应用程序上工作,该应用程序有一个课程提纲,我想复制或克隆此课程提纲。 在我的课程提纲中,有一些模块可以持续到多个级别,这意味着一个模块可以将另一个模块作为其子模块,依此类推。例如,我有一个Grammer模块,而grammer有一个名为tenses和tenses的模块,还有另一个名为过去的模块将来这些看起来像这样。

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

数据库字段是名称,parent_id,has_children,syllabus_id,这些字段可以进一步包含一些子模块或子模块。 在数据库中检查模块是否还有其他子级,我有一个布尔值has_childrenparent_id字段将子级与父级关联。如果元素是根元素,则其'parent_id'为null。

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

我的代码是:

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

但是使用此方法,我只能检索同一级别的一个元素,而不能检索其同级元素。 我将能够通过简单的否定否定语过去来创建时态,告诉我在检索这些对象时我犯了一个错误。或者告诉我以其他方式完成任务。 在这里,我只需要更改syllabus_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)    
}
return 
}

并在函数makeClone循环中将变量i声明为var i ,将child_objsvar child_objs ,因为在此,这些变量在您的代码中被视为一个很明显的变量。

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

希望这对您来说很完美

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM