Обойдите исходный массив, вызывая предикат со значением, индексом и массивом. Добавляйте прошедшее значение в отдельный результат, не меняя входные элементы.
Самостоятельная реализация функции 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 вправе игнорировать лишние аргументы. Пропуски не посещаются, длина фиксируется до начала; мутация возможна только если её намеренно делает сам пользовательский предикат.