@Zullark

Задача на удаление эквивалентных false элементов массива.Почему не работает мой код?

Текст задачи:

Remove all falsy values from an array.

Falsy values in JavaScript are false, null, 0, "", undefined, and NaN.

Мой код:

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
for(let i=0;i<arr.length;i++)  {
  console.log(!arr[i]);
  if (!arr[i]){
    arr.splice(i,1);
    console.log(arr);
  }
}
console.log(arr);
  return arr;
}

bouncer([7, "ate", "", false, 9]);
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
Нужно немного подробнее сделать отладку, и посмотреть внимательно, что происходит.
Пример
function bouncer(arr) {
  // Don't show a false ID to this bouncer.
  for(let i=0;i<arr.length;i++)  {
    console.log("Индекс:",i,"Значение:",arr[i]+'',"Отрицание:",!arr[i]);
    if (!arr[i]){
      arr.splice(i,1);
      console.log("Сработало условие, новый массив:",[...arr]);
    }
  }
  console.log("Итоговый результат:",arr);
  return arr;
}

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

Сразу станет видно, что при удалении элемента смещаются индексы, но вы их продолжаете перебирать по порядку. Следовательно, нужно либо возвращать индекс на 1 назад при удалении i--, либо перебирать массив с конца к началу:
Решение 1
function bouncer(arr) {
  // Don't show a false ID to this bouncer.
  for(let i=0;i<arr.length;i++)  {
    console.log("Индекс:",i,"Значение:",arr[i]+'',"Отрицание:",!arr[i]);
    if (!arr[i]){
      arr.splice(i,1);
      i--;
      console.log("Сработало условие, новый массив:",[...arr]);
    }
  }
  console.log("Итоговый результат:",arr);
  return arr;
}

bouncer([0, false, 7, "ate", "", false, 9, NaN]);
Решение 2
function bouncer(arr) {
  // Don't show a false ID to this bouncer.
  for(let i=arr.length-1;i>=0;i--)  {
    console.log("Индекс:",i,"Значение:",arr[i]+'',"Отрицание:",!arr[i]);
    if (!arr[i]){
      arr.splice(i,1);
      console.log("Сработало условие, новый массив:",[...arr]);
    }
  }
  console.log("Итоговый результат:",arr);
  return arr;
}

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

P.S. А для вставки кода в вопрос есть специальная кнопка, чтобы разметка не съехала.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы