30秒到達戰(zhàn)場
2018-10-19 10:15:15
function getAim(items, aim) { if (items == null) return; for (var i = 0; i < items.length; i++) { if (items[i].id == aim && items[i].childrens != null && items[i].childrens.length > 0) { return items[i]; //這行執(zhí)行后i還會再++,已經(jīng)返回了,循環(huán)還在繼續(xù)。為什么? } else if (items[i].childrens != null && items[i].childrens.length > 0) { getAim(items[i].childrens, aim); } }}這個方法是遞歸找子節(jié)點中id = aim的那個節(jié)點。 return items[i] 這行代碼找到后返回,返回后程序還是執(zhí)行了i++,知道循環(huán)完畢,我都return了,怎么還會執(zhí)行啊。怎么改呢?
1 回答

繁花如伊
TA貢獻2012條經(jīng)驗 獲得超12個贊
沒有運行,我大概猜一下。
應(yīng)該是因為遞歸套了很多層了,當(dāng)前這一層遞歸找到了結(jié)果,然后return了,但是調(diào)用棧后面還有遞歸套著呢,當(dāng)然還要繼續(xù)搜索下去,直到最后把以你輸入的DOM為根的子樹搜完為止。
這段遞歸現(xiàn)在的終止條件是,當(dāng)前葉元素為空的時候就會停止前進。
所以它會把整個子樹搜索完畢,而且你的結(jié)果好像還不能傳遞到最外面去。
那么你需要做的就是再增加一個終止條件,這個條件就是當(dāng)搜索到目標(biāo)的時候停止循環(huán),并把結(jié)果返回上一層遞歸。那么這樣的話,仔細觀察這段代碼,應(yīng)該怎么改造呢?
當(dāng)前遞歸搜索到結(jié)果,和沒有搜索到結(jié)果的區(qū)別在哪里?
區(qū)別在于,一個返回了目標(biāo)元素,一個返回了undefined
。
那么只要這樣就行了:
function getAim(items, aim) { let ans = viod 0; if (items == null) return; for (var i = 0; i < items.length; i++) { if (items[i].id == aim && items[i].childrens != null && items[i].childrens.length > 0) { return items[i]; } else if (items[i].childrens != null && items[i].childrens.length > 0) { /***改動在這里***/ ans = getAim(items[i].childrens, aim); if (ans) { return (ans); } /***改動在這里***/ } } }
我并沒有運行,你自己試試看,思路是沒有問題的。
添加回答
舉報
0/150
提交
取消