Пройдите существующие индексы массива, вызывая callback со значением, индексом и массивом. Если результат truthy, добавьте элемент в новый плотный массив.
Создание собственного аналога метода filter
Пройдите существующие индексы массива, вызывая callback со значением, индексом и массивом. Если результат truthy, добавьте элемент в новый плотный массив.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию myFilter, которая будет работать так же, как встроенный Array.prototype.filter. После её добавления к массиву, вызов myFilter должен возвращать тот же результат, что и оригинальный filter.
const source = [1, 2, 3, 4, 5, 6];
const expected = source.filter(item => item % 2);
const actual = source.myFilter(item => item % 2);
console.log(expected);
// console.log(actual);
Ответ
Пройдите существующие индексы массива, вызывая callback со значением, индексом и массивом. Если результат truthy, добавьте элемент в новый плотный массив.
function myFilter(callback, thisArg) {
'use strict';
if (!Array.isArray(this) || typeof callback !== 'function') throw new TypeError('Invalid arguments');
const result = [];
const 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(source, 'myFilter', { value: myFilter, configurable: true });
source.myFilter(item => item % 2); // [1, 3, 5]
В примере метод добавлен только source, не глобальному Array.prototype. Пропуски не вызывают callback, исходная длина фиксируется до обхода. Это учебный вариант для массивов, без поведения Symbol.species.