Получить список названий объектов по типу "Устройства"

Исходник выведет Test 1, Test 2, Test 3. Для большого числа типов замените массив mapIds на Set, чтобы не выполнять линейный includes для каждого объекта.

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

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

Исходник выведет Test 1, Test 2, Test 3. Для большого числа типов замените массив mapIds на Set, чтобы не выполнять линейный includes для каждого объекта.

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

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

Условие

Задача состоит из двух частей:

  1. Вывести строку, содержащую названия объектов.
  2. Реализовать функцию, которая формирует строку с именами объектов (через запятую), если их object_type относится к типам, у которых поле class равно строке "Устройства".
interface IObjectItem {
    id: number;
    name: string;
    object_type: number;
}

interface IObjectType {
    id: number;
    class: string;
}

const objects: IObjectItem[] = [
    { 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 },
    { id: 5, name: "Test 5", object_type: 4 },
];

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

function getNames(objects: IObjectItem[], object_types: IObjectType[]): string {
    const mapIds: number[] = [];

    object_types.forEach((type) => {
        if (type.class === "Устройства") mapIds.push(type.id);
    });

    const result: string[] = [];

    objects.forEach((obj) => {
        if (mapIds.includes(obj.object_type)) result.push(obj.name);
    });

    return result.join(", ");
}

console.log(getNames(objects, object_types));

Ответ

Исходник выведет Test 1, Test 2, Test 3. Для большого числа типов замените массив mapIds на Set, чтобы не выполнять линейный includes для каждого объекта.

function getNames(objects: IObjectItem[], object_types: IObjectType[]): string {
  const ids = new Set(object_types.filter(type => type.class === 'Устройства').map(type => type.id));
  return objects.filter(item => ids.has(item.object_type)).map(item => item.name).join(', ');
}

Ожидаемое время становится O(n+m) вместо O(nm). Для первого пункта без фильтра подходит objects.map(item => item.name).join(', '). При огромных объёмах саму итоговую строку заменяют потоковым выводом.

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

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

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

Подробнее