我认为我的递归工作正常,但我无法将最初请求的项目的属性设置为正确的值。
这里的目标是找到嵌套项的最顶层父(或“祖先”,“深度= 0”)(基于字典“父”属性的分类),并相应地分配最初请求的嵌套项的“祖先”属性
例如,在
中苹果
- 红色
- - 帝国
- - - 新鲜
虽然我是在“按需”和个人的基础上尝试这一点,但我愿意采用一种解决方案,一举标记所有与同一祖先相关的孩子或者声明,因为这可能是更有效率。
请求
for (var mc:Object in taxonomy) {
var term = taxonomy[mc];
term["ancestor"] = getAncestor(term);
trace("Setting " + term.name + "'s ancestor as [" + term.ancestor + "]");
... }
功能
function getAncestor(term:Object):String {
var ancestor = "default";
for(var obj:Object in taxonomy) {
if(term.parent == taxonomy[obj].tid) { // If next object is current object's parent
if(taxonomy[obj].depth == 0) { // And if object's parent is a root object
// Then object's parent is the ancestor
trace(term.name + "'s parent IS the root (" + taxonomy[obj].name + "). DONE."); // "term" here is NOT originally requested term
return(taxonomy[obj].name); // Return DIRECTLY to function call and assign originally requested term with this name.
break; // Get the hell out of here
}
else { // If object's parent is not a root object
trace(term.name + "'s parent (" + taxonomy[obj].name + ") is NOT a root. LOOPING.");
getAncestor(taxonomy[obj]); // Step function again with current object's parent object as current object
}
}
}
return(ancestor);
}
最后,这是基于我的许多调试语句的跟踪输出的片段:
治疗的父母(饮食失调)不是根。循环。
饮食失调的父母(心身)不是根。循环。
Psychosomatic的父母(疾病/疾病)不是根。循环。
疾病/疾病的父母(个人)不是根。循环。
个人的父母(健康)不是根。循环。
健康的父母是根(人)。 DONE。
将治疗的祖先设置为[默认]
如您所见,虽然递归确实找到了根,但最初请求的项仍然是默认值。我错过了什么?
答案 0 :(得分:0)
我猜你想要的其他声明:
ancestor = getAncestor(taxonomy[obj]);
现在你正在调用递归但是对返回值一无所知,所以你永远不会更新祖先变量。
此外,break
声明之后的return
毫无意义。 :)
如果我理解正确,你实际上可以做到:
return getAncestor(taxonomy[obj]);
否则你的循环将继续运行。如果没有这个,你的循环将会覆盖分类中的所有内容,即使它看到的第一个循环也是它所依据的那个循环。
答案 1 :(得分:0)
也许我错过了某些人,但我不明白为什么你需要使用递归来做这件事。在普通函数内部,只需循环遍历目标的父对象,直到找到一个为根,然后将Fresh的祖先设置为该对象。