返回和记录相同的变量不匹配

时间:2017-10-25 16:48:11

标签: javascript arrays

我有一个名为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(更多内容!?)

2 个答案:

答案 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;
}

Try it

答案 1 :(得分:0)

那是因为你第一次运行

getNewBarID();

,其中

if (bars[i] == i) 

是真的。从那里你进行下一个调用,是的,但是第一个调用在没有返回值的情况下执行。最终会得到一个返回值,但是首先执行两次而不返回任何内容。只需在if-case中添加一个返回值:

return getNewBarID(i);