Самостоятельная реализация функции filter

Обойдите исходный массив, вызывая предикат со значением, индексом и массивом. Добавляйте прошедшее значение в отдельный результат, не меняя входные элементы.

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

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

Обойдите исходный массив, вызывая предикат со значением, индексом и массивом. Добавляйте прошедшее значение в отдельный результат, не меняя входные элементы.

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

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

Условие

Необходимо написать собственную версию функции filter, которая принимает массив и предикат‑функцию, возвращая новый массив, содержащий только те элементы, для которых предикат вернул true. При реализации следует учитывать, что исходный массив не должен изменяться, а предикат может принимать один, два или три аргумента (элемент, индекс, исходный массив).

Ответ

Обойдите исходный массив, вызывая предикат со значением, индексом и массивом. Добавляйте прошедшее значение в отдельный результат, не меняя входные элементы.

function filter(array, predicate, thisArg) {
  if (typeof predicate !== 'function') throw new TypeError('Expected predicate');
  const result = [], length = array.length;
  for (let index = 0; index < length; index++) {
    if (!(index in array)) continue;
    const value = array[index];
    if (predicate.call(thisArg, value, index, array)) result.push(value);
  }
  return result;
}

Как у стандартного filter, принимается любой truthy-результат, а не только литерал true. Callback вправе игнорировать лишние аргументы. Пропуски не посещаются, длина фиксируется до начала; мутация возможна только если её намеренно делает сам пользовательский предикат.

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

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

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

Подробнее