Исходник выведет Test 1, Test 2, Test 3. Для большого числа типов замените массив mapIds на Set, чтобы не выполнять линейный includes для каждого объекта.
Получить список названий объектов по типу "Устройства"
Исходник выведет Test 1, Test 2, Test 3. Для большого числа типов замените массив mapIds на Set, чтобы не выполнять линейный includes для каждого объекта.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача состоит из двух частей:
- Вывести строку, содержащую названия объектов.
- Реализовать функцию, которая формирует строку с именами объектов (через запятую), если их
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(', '). При огромных объёмах саму итоговую строку заменяют потоковым выводом.