filter2 должен зафиксировать начальную длину, пропускать отсутствующие индексы и передавать predicate значение, индекс и массив. Новый массив содержит исходные значения, прошедшие проверку.
Создание собственного метода массивного фильтра
filter2 должен зафиксировать начальную длину, пропускать отсутствующие индексы и передавать predicate значение, индекс и массив. Новый массив содержит исходные значения, прошедшие проверку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется реализовать собственный метод filter2, работающий аналогично встроенному Array.prototype.filter. Метод должен принимать функцию‑предикат и возвращать новый массив, содержащий только те элементы, для которых предикат вернул truthy‑значение.
const numbers = [1, 2, 3, 4, 5];
const result1 = numbers.filter(item => item % 2);
console.log(result1); // [1, 3, 5]
// const result2 = numbers.filter2(item => item % 2);
Ответ
filter2 должен зафиксировать начальную длину, пропускать отсутствующие индексы и передавать predicate значение, индекс и массив. Новый массив содержит исходные значения, прошедшие проверку.
Object.defineProperty(Array.prototype, 'filter2', {
configurable: true, writable: true,
value: function (predicate, thisArg) {
'use strict';
if (this == null) throw new TypeError('Нет массива');
if (typeof predicate !== 'function') throw new TypeError('Нет предиката');
const source = Object(this), length = source.length;
const result = [];
for (let i = 0; i < length; i++) {
if (!(i in source)) continue;
const value = source[i];
if (predicate.call(thisArg, value, i, source)) result.push(value);
}
return result;
}
});
Это учебная реализация для обычных массивов, не полный polyfill со Species и нормализацией произвольного array-like length. Значение сохраняется до callback: предикат может изменить исходный элемент. Добавленные за исходной длиной элементы не проверяются. Расширять глобальный прототип в продукте без необходимости не стоит.