【问题标题】:Copy a tree recursively in Meteorjs在 Meteorjs 中递归复制树
【发布时间】:2014-05-01 09:52:03
【问题描述】:

我正在开发一个 Meteorjs 应用程序,我有一个教学大纲,我想复制或克隆这个教学大纲。在我的教学大纲中,有一些模块可以达到多个级别,这意味着一个模块可以有另一个模块作为其子模块等等。例如,我有一个模块语法,语法有另一个模块,名为时态和时态,还有一些其他模块,名为现在过去未来这些将是这样的。

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

数据库字段是 姓名, parent_id, 有孩子, 教学大纲_id 这些mudules可以进一步有一些子模块或子模块。 在数据库中检查一个模块是否有更多的孩子,我有一个布尔字段has_childrenparent_id 将孩子与父母联系起来。如果元素是根元素,它的“parent_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);
        }
    }
}

但是使用它我只能检索同一级别的一个元素,但不能检索其兄弟姐妹。 我将能够创造 时态 过去的 简单的 消极的 疑问句 告诉我在检索这些对象时我在哪里犯了错误。或者告诉我任何其他方式来完成任务。 在这里我只需要更改 syllabus_id 并再次创建所有对象。

【问题讨论】:

  • 您似乎很清楚自己想要做什么。你的实际问题是什么?你有没有尝试过?
  • 如果您的对象很简单(没有类或任何东西),请尝试 EJSON.clone。可能就够了。在更复杂的情况下,您需要考虑并编写树遍历:)
  • 是的,我尝试了一些方法,我正在编辑问题并在此处发布我的代码

标签: javascript recursion meteor meteorite meteor-up


【解决方案1】:

您的代码中的一切都是完美的,只需在您的代码中添加递归函数终止语句。 克隆教学大纲:功能(教学大纲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 ichild_objs 作为var 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
    }
    }     

希望这对你来说是完美的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多