Создание собственного метода фильтрации для массивов

Нужно сохранить длину на начало обхода, пропускать отсутствующие индексы, передавать callback значение/индекс/массив и складывать прошедшие значения в новый плотный массив.

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

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

Нужно сохранить длину на начало обхода, пропускать отсутствующие индексы, передавать callback значение/индекс/массив и складывать прошедшие значения в новый плотный массив.

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

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

Условие

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

const numbers = [1, 2, 3, 4, 5, 6, 7, 8];

const result = numbers.myFilter((el) => el % 2);

Ответ

Нужно сохранить длину на начало обхода, пропускать отсутствующие индексы, передавать callback значение/индекс/массив и складывать прошедшие значения в новый плотный массив.

function myFilter(callback, thisArg) {
  'use strict';
  if (!Array.isArray(this) || typeof callback !== 'function') throw new TypeError('Invalid arguments');
  const result = [], length = this.length;
  for (let index = 0; index < length; index++) {
    if (!(index in this)) continue;
    const value = this[index];
    if (callback.call(thisArg, value, index, this)) result.push(value);
  }
  return result;
}
Object.defineProperty(numbers, 'myFilter', { value: myFilter, configurable: true });

Получится [1,3,5,7]. Значение сохраняется до callback, поэтому изменение исходного элемента внутри callback не подменяет уже проверяемое значение. Это основной алгоритм для обычных массивов; буквальное полное соответствие стандарту дополнительно требует array-like, ToLength и ArraySpeciesCreate. Подменять глобальный прототип в приложении не рекомендуется.

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

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

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

Подробнее