Самодельная реализация функции filter

Обойдите массив и добавляйте исходное значение, если callback возвращает truthy. Callback получает значение, индекс и массив; его результат не подменяет сам элемент.

Короткий ответ

Что ответить на собеседовании

Обойдите массив и добавляйте исходное значение, если callback возвращает truthy. Callback получает значение, индекс и массив; его результат не подменяет сам элемент.

Подробный разбор

Ответ с пояснениями

Условие

Создайте свою версию функции filter, которая принимает два аргумента: массив и функцию‑обработчик.

 const filter = (arr, fn) => { };

Пример 1:

  • Вход: arr = [0,10,20,30], fn = function greaterThan10(n) { return n > 10; }
  • Выход: [20,30]
  • Пояснение: функция оставляет только те элементы, которые больше 10.

Пример 2:

  • Вход: arr = [1,2,3], fn = function firstIndex(n, i) { return i == 0; }
  • Выход: [1]
  • Пояснение: обработчик может получать индекс элемента; здесь оставляется элемент с индексом 0.

Пример 3:

  • Вход: arr = [-2,-1,0,1,2], fn = function plusOne(n) { return n + 1 }
  • Выход: [-2,0,1,2]
  • Пояснение: значения, приводящиеся к false (например, 0), отбрасываются.

Ответ

Обойдите массив и добавляйте исходное значение, если callback возвращает truthy. Callback получает значение, индекс и массив; его результат не подменяет сам элемент.

const filter = (arr, fn) => {
  const result = [];
  const length = arr.length;
  for (let index = 0; index < length; index++) {
    if (!(index in arr)) continue;
    const value = arr[index];
    if (fn(value, index, arr)) result.push(value);
  }
  return result;
};

В третьем примере -1 удаляется, поскольку -1 + 1 равно 0; -2 остаётся, потому что -1 truthy. Пропуски массива не посещаются. Время O(n), память результата O(n); исходный массив не меняется самой функцией, хотя callback может его изменить.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее