2
votes

Bouncer faux de l'algorithme CodeCamp

Pourquoi cela fonctionne-t-il pour tout faux mais nul?

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


0 commentaires

3 Réponses :


1
votes

Parce que l'expression finale qui se produit dans une boucle for , le i ++ ici, sera toujours exécutée après le corps de la boucle. Donc, étant donné la logique actuelle, quel que soit le tableau d'entrée, i sera 0 au début du corps de la boucle uniquement lors de la première itération:

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

Vous pouvez réinitialiser i à -1 à la place, ce qui fait que i ++ devient i à 0 au début du corps de la boucle suivante:

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

Ou, bien sûr, utilisez plutôt .filter , .filter est beaucoup plus facile à raisonner:

p >

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


0 commentaires

0
votes

Juste pour ajouter quelque chose à la réponse donnée par CertainPerformance , vous pouvez également gérer l'incrément de i dans le corps de la boucle, comme ceci:

p>

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 commentaires

1
votes

ou vous pouvez utiliser

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


0 commentaires