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);
}