javascript CodeCamp算法假弹跳器

blpfk2vs  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(167)

为什么这对每个falsy but null都有效?

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, ""])
du7egjpx

du7egjpx1#

因为在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, ""]));
8xiog9wr

8xiog9wr2#

或者你可以用

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

egdjgwm83#

只是为了给CertaintPerformance给出的答案添加更多内容,您还可以在循环体中处理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, ""]));
zvokhttg

zvokhttg4#

arr.splice(i,1),这里的i和外部循环的值相同。所以赋值给它0没有帮助。另外你需要从i中减去1:arr.splice(i--,1),以便不会跳过向下移动的条目。

function bouncer(arr) {

  for(let i=0;i<arr.length;i++){
  
    if(!(arr[i]))
      arr.splice(i--,1);
  }   
  return arr;
  
}

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

ac1kyiln5#

function bouncer(arr) {
    return arr.filter(val => val);
}
bouncer([false, null, 0, NaN, undefined, ""])

每个值都将被视为布尔值,如果该值是真值,则将选择该值,如果该值被错误地拒绝。

相关问题