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, ""])
3 Réponses :
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, ""]));
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, ""]));
ou vous pouvez utiliser
function bouncer(arr){ return arr.filter(Boolean); }