Нужно сохранить длину на начало обхода, пропускать отсутствующие индексы, передавать 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. Подменять глобальный прототип в приложении не рекомендуется.