Сначала соберите 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) без учёта требуемого вывода.