← Назад к вопросам

Что используешь для хранения коллекции в JavaScript?

1.3 Junior🔥 191 комментариев
#Node.js и JavaScript#Алгоритмы и структуры данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Структуры данных для хранения коллекций в JavaScript

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

Встроенные структуры данных

1. Array Основная структура для упорядоченных коллекций:

// Простые операции
const numbers = [1, 2, 3, 4, 5];
numbers.push(6);           // O(1) amortized
numbers.pop();              // O(1)
numbers.find(n => n > 3);   // O(n)

// Для больших массивов используй методы осторожно
const largeArray = new Array(1000000);
largeArray.splice(500000, 1); // O(n) — дорого!

Когда использовать: упорядоченные данные, простые итерации, случайный доступ по индексу.

2. Object Для хранения пар ключ-значение:

const user = {
  id: 1,
  name: "Ivan",
  email: "ivan@example.com"
};

// Поиск по ключу — O(1)
const email = user.email;

// Недостатки: порядок ключей неопределён в старых версиях
const obj = {};
for (let i = 1; i <= 1000; i++) {
  obj[i] = `item_${i}`; // Может быть медленно для больших объёмов
}

Когда использовать: небольшие наборы данных с именованными ключами.

3. Map Современная альтернатива Object с лучшей производительностью:

const userMap = new Map();
userMap.set(1, { name: "Ivan", email: "ivan@example.com" });
userMap.set(2, { name: "Petr", email: "petr@example.com" });

// Поиск — O(1)
const user = userMap.get(1);

// Проверка наличия ключа
if (userMap.has(1)) {
  console.log("User exists");
}

// Итерация в порядке вставки
for (const [id, user] of userMap) {
  console.log(id, user);
}

// Преобразование в массив
const entries = Array.from(userMap.entries());

Плюсы Map:

  • Любой тип данных как ключ (включая объекты)
  • Сохраняет порядок вставки
  • Встроенные методы: .size, .clear()
  • Лучшая производительность для больших коллекций

4. Set Для уникальных значений:

const uniqueIds = new Set([1, 2, 2, 3, 3, 3]);
console.log(uniqueIds); // Set { 1, 2, 3 }
console.log(uniqueIds.size); // 3

// Проверка наличия элемента — O(1)
if (uniqueIds.has(2)) {
  console.log("ID exists");
}

// Удаление
uniqueIds.delete(2);

// Очистка
uniqueIds.clear();

Когда использовать: удаление дубликатов, быстрая проверка наличия элемента.

5. WeakMap и WeakSet Для отслеживания объектов без предотвращения garbage collection:

const metadata = new WeakMap();
const obj = { id: 1 };

metadata.set(obj, { created: Date.now() });

// Если obj больше не нужен и удаляется из памяти,
// запись в metadata автоматически удалится

Когда использовать: кэширование metadata для объектов, реализация приватных данных.

Структуры данных для конкретных задач

Очередь (Queue)

class Queue {
  constructor() {
    this.items = new Map();
    this.count = 0;
    this.lowestCount = 0;
  }

  enqueue(element) {
    this.items.set(this.count, element);
    this.count++;
  }

  dequeue() {
    if (this.isEmpty()) return undefined;
    const result = this.items.get(this.lowestCount);
    this.items.delete(this.lowestCount);
    this.lowestCount++;
    return result;
  }

  isEmpty() {
    return this.count - this.lowestCount === 0;
  }
}

Стек (Stack)

const stack = [];
stack.push(1);
stack.push(2);
const top = stack.pop(); // 2

Внешние библиотеки

Lodash — для удобной работы с массивами и объектами:

const _ = require(lodash);
const users = _.groupBy(data, role);
const unique = _.uniqBy(users, id);

Immutable.js — для immutable структур данных:

const { List, Map } = require(immutable);
const list = List([1, 2, 3]);
const newList = list.push(4); // Создаёт новый список

Выбор структуры: практические советы

ЗадачаСтруктураСложность
Упорядоченные данныеArrayO(1) доступ, O(n) поиск
Пары ключ-значениеMapO(1) для всех операций
Уникальные значенияSetO(1) для всех операций
LIFO (последний вошёл)Array + stackO(1)
FIFO (очередь)Map/DequeO(1)
Граф/ДеревоMap/ObjectO(1) доступ к узлам

Рекомендации для Backend

  • По умолчанию используй Map вместо Object для коллекций — это быстрее и безопаснее
  • Используй Set для проверки наличия элемента (has() быстрее чем includes() на массиве)
  • Избегай частых операций splice/slice на больших массивах — O(n) сложность
  • Для хранения в БД используй структуры, которые легко сериализуются (Array, Object)
  • Для кэширования в памяти рассмотри LRU cache с Map

Выбор структуры зависит от типа операций: если нужна быстрая проверка наличия — Set, если нужны пары ключ-значение — Map, если нужен порядок — Array.