Обнаружить и исправить баги в JavaScript‑функции

Обычная функция внутри filter не наследует this сервиса. Замените её стрелкой или передайте this вторым аргументом filter; используйте строгое сравнение статуса.

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

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

Обычная функция внутри filter не наследует this сервиса. Замените её стрелкой или передайте this вторым аргументом filter; используйте строгое сравнение статуса.

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

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

Условие

В данном фрагменте JavaScript‑кода реализован объект‑сервис, который хранит список пользователей и позволяет получить только те, чей статус совпадает с текущим фильтром. Однако реализация содержит логическую ошибку, из‑за которой фильтрация работает некорректно.

Ваша задача — проанализировать код, выявить причину неправильного поведения и предложить исправление, сохранив общую структуру объекта.

 const userService = {
    currentFilter: 'active',
    users: [
    { name: 'Alex', status: 'active' },
    { name: 'Nick', status: 'deleted' },
    ],
    getFilteredUsers: function () {
    return this.users.filter(function (user) {
         return user.status == this.currentFilter;
    });
    }
};

console.log(userService.getFilteredUsers());

Ответ

Обычная функция внутри filter не наследует this сервиса. Замените её стрелкой или передайте this вторым аргументом filter; используйте строгое сравнение статуса.

getFilteredUsers: function () {
  return this.users.filter(user => user.status === this.currentFilter);
}

Это замена метода внутри исходного объекта. Стрелка захватывает this внешнего метода, который при вызове userService.getFilteredUsers() равен userService. Результат — массив с Alex. Альтернатива: this.users.filter(function (user) { return user.status === this.currentFilter; }, this). Сам внешний метод не следует делать стрелкой: тогда он захватит посторонний this.

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

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

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

Подробнее