CodeCamp алгоритм вышибалы - PullRequest
0 голосов
/ 13 февраля 2019

почему это работает для всех ложных, но нулевых?

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Просто чтобы добавить что-то еще к ответу, данному 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, ""]));
0 голосов
/ 13 февраля 2019

Поскольку последнее выражение, которое встречается в цикле 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, ""]));
...