猿问

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

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了,怎么还会执行啊。怎么改呢?

30秒到达战场
浏览 496回答 1
1回答

繁花如伊

没有运行,我大概猜一下。应该是因为递归套了很多层了,当前这一层递归找到了结果,然后return了,但是调用栈后面还有递归套着呢,当然还要继续搜索下去,直到最后把以你输入的DOM为根的子树搜完为止。这段递归现在的终止条件是,当前叶元素为空的时候就会停止前进。&nbsp;所以它会把整个子树搜索完毕,而且你的结果好像还不能传递到最外面去。那么你需要做的就是再增加一个终止条件,这个条件就是当搜索到目标的时候停止循环,并把结果返回上一层递归。那么这样的话,仔细观察这段代码,应该怎么改造呢?当前递归搜索到结果,和没有搜索到结果的区别在哪里?区别在于,一个返回了目标元素,一个返回了undefined。那么只要这样就行了:function&nbsp;getAim(items,&nbsp;aim)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ans&nbsp;=&nbsp;viod&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(items&nbsp;==&nbsp;null)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;items.length;&nbsp;i++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if&nbsp;(items[i].id&nbsp;==&nbsp;aim&nbsp;&&&nbsp;items[i].childrens&nbsp;!=&nbsp;null&nbsp;&&&nbsp;items[i].childrens.length&nbsp;>&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;items[i]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(items[i].childrens&nbsp;!=&nbsp;null&nbsp;&&&nbsp;items[i].childrens.length&nbsp;>&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/***改动在这里***/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;getAim(items[i].childrens,&nbsp;aim);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ans)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(ans); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/***改动在这里***/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} }我并没有运行,你自己试试看,思路是没有问题的。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答