[英]Problem with simple Recursion in Javascript
这是代码段,这会陷入无限循环-带有“太多的递归错误”。
SW = {
WData : {
wf : {
roots : [852,1517,1523,1540],
leaves : [],
features : {
852: { "cf":"855,1848"},
1517: { "cf":"1929,1930"},
1523: { "cf":""},
1540: { "cf":"1546,1549"},
855: { "cf":"" },
1848: { "cf":""},
1929: { "cf":""},
1930: { "cf":""},
1546: { "cf":"1600"},
1549: { "cf":""},
1600: { "cf":""}
}
}
},
init: function init(){
this.buildTree();
//console.log(this.WData.wf.leaves);
},
buildTree : function(){
this.getLeaves(this.WData.wf.roots);
},
getLeaves: function(roots){
for(var i in roots){
var root = this.WData.wf.roots[i];
if( this.WData.wf.features[ root ].cf === ""){
this.WData.wf.leaves.push( root );
return false;
}
else{
this.getLeaves( this.WData.wf.features[root].cf.split(',').map(Number) );
}
}
return false;
}
}
SW.init();
无法理解这里的问题。 我感觉自己犯了一个简单的错误。
您有几个问题:
在你的循环的开始,你应该用roots
而不是this.WData.wf.roots
,例如。 像这样:
var root = roots[i];
您正在尝试将新项目推送到字符串而不是数组上,因此在您的结构中,将叶子更改为以下内容:
leaves : ["asdf"],
当您尝试将其分配给结果div(在jsFiddle中)时,这将导致错误,因此请使用join创建一个字符串
$('#result').append( SW.WData.wf.leaves.join(",") );
您的终止条件在此行中:
for(var i in roots){
因此,为什么不继续使用类似console.log(i)
来查看它是否在按照您的想法进行。 这种技术通常比调试器快。
您在递归中一直引用原始树-您可能想在递归传入的节点上拆分:
getLeaves: function(roots){
for(var i in roots){
var root = roots[i];
if( !(root.cf)){
this.WData.wf.leaves.push( root );
return false;
}
else{
this.getLeaves( root.cf.split(',').map(Number) );
}
}
return false;
据我所知,您需要更改features
条目中cf
属性的值以反映您已经对其进行了解析。 如果不这样做,则此代码分支
else{
this.getLeaves( this.WData.wf.features[root].cf.split(',').map(Number) );
}
如果我是对的,将无限地向leaves
Array
添加值。
因此,尝试添加如下内容:
else {
var cf = this.WData.wf.features[root].cf ; // save the current cf value
//... change this.WData.wf.features[root].cf to the desired value
this.getLeaves( cf.split(',').map(Number) ) ;
}
顺便说一下, Array.map
是浏览器实现特定的功能(对于Gecko浏览器,例如Firefox)。 换句话说,您的代码在未实现的地方将无法正常工作。
另外,我认为,最好添加注释并折叠代码以使其更易于理解。 现在的书写方式虽然简洁但难以把握其基本目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.