Обычная функция внутри filter не наследует this сервиса. Замените её стрелкой или передайте this вторым аргументом filter; используйте строгое сравнение статуса.
Обнаружить и исправить баги в JavaScript‑функции
Обычная функция внутри 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.