Создание собственного аналога метода filter

Пройдите существующие индексы массива, вызывая callback со значением, индексом и массивом. Если результат truthy, добавьте элемент в новый плотный массив.

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

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

Пройдите существующие индексы массива, вызывая 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.

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

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

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

Подробнее