[英]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_children
和parent_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_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
}
}
希望这对您来说很完美
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.