🟨 JavaScript
Средняя
🕐 10 мин

Реализуйте метод filter

Цель: создать функцию myFilter(arr, callback), которая повторяет поведение Array.prototype.filter.

Описание задачи

Напишите функцию myFilter, которая принимает массив arr и функцию обратного вызова callback. Функция должна вернуть новый массив, содержащий только те элементы из arr, для которых callback вернул true. Не используйте встроенный метод Array.prototype.filter.

Эта задача помогает глубже понять работу методов высшего порядка в JavaScript, таких как filter, map и reduce. Понимание их внутреннего устройства является ключевым для написания чистого, эффективного и функционального кода.

💡 Подсказка к решению
  1. Создайте пустой массив для хранения отфильтрованных элементов.
  2. Переберите исходный массив.
  3. Для каждого элемента вызовите callback. Если он возвращает true, добавьте элемент в новый массив.
  4. Верните новый массив.
👀 Решение #1 (цикл for)
/**
 * Функция myFilter, реализованная с использованием цикла for.
 * @param {Array} arr - Входной массив.
 * @param {Function} callback - Функция-предикат.
 * @returns {Array} - Новый отфильтрованный массив.
 */
function myFilter(arr, callback) {
  // 1. Создаем пустой массив для хранения результатов.
  const filteredArray = [];
 
  // 2. Запускаем цикл для перебора каждого элемента исходного массива.
  for (let i = 0; i < arr.length; i++) {
    // 3. Вызываем callback для текущего элемента `arr[i]`.
    //    Если он возвращает `true`, условие выполняется.
    if (callback(arr[i], i, arr)) {
      // 4. Добавляем элемент в наш новый массив.
      filteredArray.push(arr[i]);
    }
  }
 
  // 5. Возвращаем новый массив с отфильтрованными элементами.
  return filteredArray;
}

Пошаговое объяснение кода:

  1. function myFilter(arr, callback) { ... }

    • Объявляем функцию myFilter, которая принимает два аргумента: arr (массив для фильтрации) и callback (функция, которая будет определять, включать ли элемент).
  2. const filteredArray = [];

    • Создаем пустой массив filteredArray. Здесь будут храниться элементы, которые пройдут проверку. Этот массив мы вернем в конце.
  3. for (let i = 0; i < arr.length; i++) { ... }

    • Запускаем цикл for для перебора каждого элемента в исходном массиве arr.
    • let i = 0: Начинаем с первого элемента (индекс 0).
    • i < arr.length: Цикл будет продолжаться, пока i меньше общего количества элементов в массиве.
    • i++: После каждой итерации увеличиваем i на 1, чтобы перейти к следующему элементу.
  4. if (callback(arr[i], i, arr)) { ... }

    • Это ключевая часть логики. Внутри цикла мы вызываем callback.
    • arr[i]: Передаем в callback текущий элемент.
    • i: Передаем его индекс.
    • arr: Передаем сам исходный массив.
    • if (...): Если callback возвращает true, условие считается выполненным.
  5. filteredArray.push(arr[i]);

    • Если условие в if истинно, мы добавляем текущий элемент arr[i] в наш массив filteredArray.
  6. return filteredArray;

    • После того как цикл завершится, функция возвращает filteredArray, который теперь содержит все отфильтрованные элементы.

Почему так:

  • Классика: Это самый традиционный и прямолинейный способ итерации по массиву в JavaScript.
  • Производительность: Цикл for часто является самым быстрым способом обхода массива, так как он имеет минимальные накладные расходы.
  • Контроль: Он дает полный контроль над процессом итерации (например, можно изменять шаг или начинать с конца).

Сигнатура функции callback

Ваша реализация должна поддерживать стандартную сигнатуру callback-функции для filter: callback(element, index, array).

  • element: Текущий обрабатываемый элемент в массиве.
  • index (необязательный): Индекс текущего элемента.
  • array (необязательный): Массив, по которому осуществляется проход.

Примеры

const numbers = [1, 2, 3, 4, 5];
const even = myFilter(numbers, (num) => num % 2 === 0);
// even должен быть [2, 4]
 
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const longWords = myFilter(words, (word) => word.length > 6);
// longWords должен быть ['exuberant', 'destruction', 'present']

Требования

  • Функция должна называться myFilter.
  • Не изменяйте исходный массив.
  • Возвращайте новый массив.

🧑‍💻 Это не баг! Это фича!

Редактор кода намеренно скрыт на мобильном.

Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.

📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.

💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!