[英]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.