Обойдите массив и добавляйте исходное значение, если callback возвращает truthy. Callback получает значение, индекс и массив; его результат не подменяет сам элемент.
Самодельная реализация функции filter
Обойдите массив и добавляйте исходное значение, если callback возвращает truthy. Callback получает значение, индекс и массив; его результат не подменяет сам элемент.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте свою версию функции filter, которая принимает два аргумента: массив и функцию‑обработчик.
const filter = (arr, fn) => { };
Пример 1:
- Вход:
arr = [0,10,20,30],fn = function greaterThan10(n) { return n > 10; } - Выход:
[20,30] - Пояснение: функция оставляет только те элементы, которые больше 10.
Пример 2:
- Вход:
arr = [1,2,3],fn = function firstIndex(n, i) { return i == 0; } - Выход:
[1] - Пояснение: обработчик может получать индекс элемента; здесь оставляется элемент с индексом 0.
Пример 3:
- Вход:
arr = [-2,-1,0,1,2],fn = function plusOne(n) { return n + 1 } - Выход:
[-2,0,1,2] - Пояснение: значения, приводящиеся к
false(например,0), отбрасываются.
Ответ
Обойдите массив и добавляйте исходное значение, если callback возвращает truthy. Callback получает значение, индекс и массив; его результат не подменяет сам элемент.
const filter = (arr, fn) => {
const result = [];
const length = arr.length;
for (let index = 0; index < length; index++) {
if (!(index in arr)) continue;
const value = arr[index];
if (fn(value, index, arr)) result.push(value);
}
return result;
};
В третьем примере -1 удаляется, поскольку -1 + 1 равно 0; -2 остаётся, потому что -1 truthy. Пропуски массива не посещаются. Время O(n), память результата O(n); исходный массив не меняется самой функцией, хотя callback может его изменить.