为了账号安全,请及时绑定邮箱和手机立即绑定

这个JavaScript方法很神奇,请问为什么?

这个JavaScript方法很神奇,请问为什么?

30秒到达战场 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];  //这行执行后i还会再++,已经返回了,循环还在继续。为什么?        }        else if (items[i].childrens != null && items[i].childrens.length > 0) {            getAim(items[i].childrens, aim);        }    }}这个方法是递归找子节点中id = aim的那个节点。 return items[i] 这行代码找到后返回,返回后程序还是执行了i++,知道循环完毕,我都return了,怎么还会执行啊。怎么改呢?
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

没有运行,我大概猜一下。

应该是因为递归套了很多层了,当前这一层递归找到了结果,然后return了,但是调用栈后面还有递归套着呢,当然还要继续搜索下去,直到最后把以你输入的DOM为根的子树搜完为止。

这段递归现在的终止条件是,当前叶元素为空的时候就会停止前进。 
所以它会把整个子树搜索完毕,而且你的结果好像还不能传递到最外面去。

那么你需要做的就是再增加一个终止条件,这个条件就是当搜索到目标的时候停止循环,并把结果返回上一层递归。那么这样的话,仔细观察这段代码,应该怎么改造呢?

当前递归搜索到结果,和没有搜索到结果的区别在哪里?
区别在于,一个返回了目标元素,一个返回了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);
            }            /***改动在这里***/
        }
    }
}

我并没有运行,你自己试试看,思路是没有问题的。


查看完整回答
反对 回复 2018-11-07
  • 1 回答
  • 0 关注
  • 495 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号