Как реализовать фильтрацию списка серверов по поколению (generation) пользователя в коде на JavaScript?

Фильтрация списка серверов по полю `generation` пользователя — распространённая задача в веб-разработке, особенно когда нужно отображать только те серверы, которые совместимы с определённым поколением аккаунта или тарифного плана.

## Базовый пример с Array.prototype.filter()

Предположим, у нас есть массив серверов и объект пользователя с полем `generation`:

javascript
const servers = [
{ id: 1, name: ‘Server Alpha’, generation: 1 },
{ id: 2, name: ‘Server Beta’, generation: 2 },
{ id: 3, name: ‘Server Gamma’, generation: 1 },
{ id: 4, name: ‘Server Delta’, generation: 3 },
];

const user = { id: 42, name: ‘Ivan’, generation: 1 };

const filteredServers = servers.filter(server => server.generation === user.generation);
console.log(filteredServers);
// [{ id: 1, name: ‘Server Alpha’, generation: 1 }, { id: 3, name: ‘Server Gamma’, generation: 1 }]

Метод `filter()` возвращает новый массив, не изменяя исходный — это важно для иммутабельности данных.

## Фильтрация с поддержкой нескольких поколений

Если пользователь имеет доступ к нескольким поколениям (например, хранятся в массиве), используйте `includes()`:

javascript
const user = { id: 42, name: ‘Ivan’, generations: [1, 2] };

const filteredServers = servers.filter(server =>
user.generations.includes(server.generation)
);

## Фильтрация с учётом вложенных данных

Если поколение хранится глубже в структуре:

javascript
const filteredServers = servers.filter(server =>
server?.config?.generation === user.generation
);

Оператор опциональной цепочки `?.` защищает от ошибок при отсутствии вложенных свойств.

## Вынесение логики в отдельную функцию

Для переиспользования и тестируемости рекомендуется оформить фильтрацию как чистую функцию:

javascript
function filterServersByUserGeneration(servers, user) {
if (!user || user.generation === undefined) return [];
return servers.filter(server => server.generation === user.generation);
}

const result = filterServersByUserGeneration(servers, user);

## Асинхронная фильтрация (если данные приходят с API)

javascript
async function getFilteredServers(userId) {
const [servers, user] = await Promise.all([
fetch(‘/api/servers’).then(r => r.json()),
fetch(`/api/users/${userId}`).then(r => r.json()),
]);
return servers.filter(s => s.generation === user.generation);
}

## Советы по оптимизации

— **Кэшируйте** результат фильтрации, если данные не меняются часто.
— **Мемоизируйте** функцию в React с помощью `useMemo`, чтобы избежать лишних перерисовок.
— При больших массивах рассмотрите предварительную **индексацию** серверов по поколению через `Map` для O(1) доступа.

Таким образом, метод `Array.prototype.filter()` в сочетании с грамотной архитектурой кода позволяет эффективно и читаемо реализовать фильтрацию серверов по поколению пользователя.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.