Почему switch запускается только один раз внутри цикла for массива Javascript? - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь написать код Javascript, который удаляет все ложные значения из данного массива. Код работает для первого отрицательного значения - находки и не работает с последующими ложными значениями, как будто после запуска переключателя весь цикл for прерывается.

Мой код указан ниже.

  function bouncer(arr) {
  for(var i=0;i<arr.length; i++){

    switch(arr[i]){
      case false:
      case null:
      case 0:
      case "":
      case undefined:
      case NaN: arr.splice(i,1); break;
    }
  }

  return arr;
}

bouncer([7, "ate",  false,"", 9]);

Это нормальное поведение переключателя?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Да, частично проблема заключается в том, что функция сплайсинга изменяет массив.

Позвольте мне добавить еще несколько аспектов. case NaN никогда не будет работать так, как вы ожидаете, потому что NaN != NaN. Поэтому, чтобы определить, является ли определенное значение NaN, используйте isNaN(var).

Sugestion: Простой ярлык для того, чего вы пытаетесь достичь, будет const bouncer = (arr) => arr.filter(Boolean);. Это эффективно удалит ложные значения, в том числе NaN. Вы можете проверить значения один за другим, вызвав в консоли js, например: Boolean(""), Boolean(0) и т. Д.

0 голосов
/ 02 сентября 2018

splice изменяет массив, что нехорошо делать во время итерации по массиву ; если элемент на i определен как ложный и имеет значение spliced, то после завершения итерации цикла for значение i будет увеличено на единицу. Так, например, если i начался в 2, элемент в 2 удален, тогда элемент, который был в 3, теперь в 2. Но элемент новый 2 никогда не проверяется, поскольку i увеличено до 3.

Вместо этого используйте .filter, который оценивает каждый элемент массива и не имеет проблем с индексацией, а также не требует ручной итерации:

const bouncer = (arr) => arr.filter((item) => {
  switch (item) {
    case false:
    case null:
    case 0:
    case "":
    case undefined:
    case NaN:
      return false;
  }
  return true;
});

console.log(bouncer([7, "ate", false, "", 9]));

Или, конечно, вы можете просто проверить, является ли каждый предмет ложным или нет:

const bouncer = (arr) => arr.filter(Boolean);

console.log(bouncer([7, "ate", false, "", 9]));
...