Отбор объектов по категории класса

Сначала соберите Set ID типов класса «Устройства», затем один раз пройдите объекты. Для миллиарда записей нужен потоковый вывод: одна итоговая строка сама может не поместиться в память.

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

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

Сначала соберите Set ID типов класса «Устройства», затем один раз пройдите объекты. Для миллиарда записей нужен потоковый вывод: одна итоговая строка сама может не поместиться в память.

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

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

Условие

Необходимо реализовать функцию, которая формирует одну строку, где имена (поле name) объектов перечислены через запятую. В итоговый список следует включать только те объекты, которые связаны с типами, у которых свойство class имеет значение "Устройства". При решении учитывать, что количество объектов может достигать порядка миллиарда, а типов — около миллиона, поэтому требуется минимизировать затраты по времени выполнения и использованию памяти.

//Объекты
const objects = [
  { id: 1, name: "Test 1", object_type: 1 },
  { id: 2, name: "Test 2", object_type: 1 },
  { id: 3, name: "Test 3", object_type: 2 },
  { id: 4, name: "Test 4", object_type: 3 },
]

//Типы
const object_types = [
  { id: 1, class: "Устройства" },
  { id: 2, class: "Устройства" },
  { id: 3, class: "Порты" },
  { id: 4, class: "Кабели" }
]

Ответ

Сначала соберите Set ID типов класса «Устройства», затем один раз пройдите объекты. Для миллиарда записей нужен потоковый вывод: одна итоговая строка сама может не поместиться в память.

function* nameChunks(objects, objectTypes) {
  const ids = new Set();
  for (const type of objectTypes) if (type.class === 'Устройства') ids.add(type.id);
  let first = true;
  for (const item of objects) {
    if (!ids.has(item.object_type)) continue;
    yield (first ? '' : ',') + item.name;
    first = false;
  }
}
// Для небольшого примера:
const result = [...nameChunks(objects, object_types)].join('');

Результат: Test 1,Test 2,Test 3. Для большого объёма потребитель записывает chunks в поток с backpressure, а objects читает курсором. Время O(n+m), дополнительная память O(m) без учёта требуемого вывода.

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

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

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

Подробнее