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

    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. А для вставки кода в вопрос есть специальная кнопка, чтобы разметка не съехала.
    Ответ написан
    1 комментарий