我有一个名为bars的数组,其中包含进度条的活动ID号。我想通过这个数组来找到与其索引不匹配的第一个值(用于查找最低的可用ID)。我的(显然是不正确的)解决方案如下:
var bars = [0,1];
function getNewBarID(counter) {
var i = counter || 0; //sets i to counter value if it exists, or to 0 if it doesn't
if (bars[i] == i) {
++i;
getNewBarID(i);
} else {
console.log(i);
return i;
}
}
getNewBarID();
当我运行它(在节点控制台和chrome js控制台中)时,它会将2
记录到控制台并返回undefined
,而它应该返回2
。
什么!?
编辑:当函数以空数组运行时,它返回并记录0
(更多内容!?)
答案 0 :(得分:2)
大概:
return getNewBarID(i);
但说实话,它应该是:
const newBar = bars.find((el,i) => el !== i) || bars.length; //newBar contains the result...
或使用旧的for循环更长一点:
function getNewBarID(){
let i = 0;
while(bars[i] === i) i++;
return i;
}
答案 1 :(得分:0)
那是因为你第一次运行
getNewBarID();
,其中
if (bars[i] == i)
是真的。从那里你进行下一个调用,是的,但是第一个调用在没有返回值的情况下执行。最终会得到一个返回值,但是首先执行两次而不返回任何内容。只需在if-case中添加一个返回值:
return getNewBarID(i);