CodeCamp算法虚假的保镖

时间:2019-02-13 01:32:23

标签: javascript arrays boolean

为什么这对每个虚假但无效的东西都起作用?

 function bouncer(arr) {
  for(let i = 0; i < arr.length; i++){
    if(!arr[i]){
      arr.splice(i,1);
      i = 0;
    }
 }
   console.log(arr);
}

bouncer([false, null, 0, NaN, undefined, ""])

3 个答案:

答案 0 :(得分:1)

由于在for循环中出现的最终表达式,此处的i++将始终在循环体之后执行。因此,根据当前逻辑,无论输入数组是什么,i只会在循环主体的开始处0处于第一次迭代期间:

function bouncer(arr) {
  for (let i = 0; i < arr.length; i++) {
    console.log('i:', i);
    if (!arr[i]) {
      arr.splice(i, 1);
      i = 0;
    }
  }
  console.log(arr);
}

console.log(bouncer([false, null, 0, NaN, undefined, ""]));

您可以将i重置为-1,从而导致i++在下一个循环主体的开始处将i变成0

function bouncer(arr) {
  for (let i = 0; i < arr.length; i++) {
    console.log('i:', i);
    if (!arr[i]) {
      arr.splice(i, 1);
      i = -1;
    }
  }
  console.log(arr);
}

console.log(bouncer([false, null, 0, NaN, undefined, ""]));

或者,当然,可以使用.filter来代替,.filter的原因要容易得多:

const bouncer = arr => arr.filter(Boolean);
console.log(bouncer([false, null, 0, NaN, undefined, ""]));

答案 1 :(得分:1)

或者你可以使用

function bouncer(arr){
  return arr.filter(Boolean);
}

答案 2 :(得分:0)

只需在 CertainPerformance 给出的答案中添加更多内容,您还可以处理循环体内i的增量,如下所示:

function bouncer(arr)
{
  for (let i = 0; i < arr.length;)
  {
    console.log('i:', i);

    if (!arr[i])
      arr.splice(i, 1);
    else
      i++;
  }

  return arr;
}

console.log(bouncer([false, null, 0, "Some value", NaN, undefined, ""]));