Подсчёт количества субъектов в каждом регионе

Используйте reduce с объектом-аккумулятором, увеличивая счётчик по region. В ожидаемом результате условия пропущен регион 4: правильный объект содержит также 4: 1.

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

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

Используйте reduce с объектом-аккумулятором, увеличивая счётчик по region. В ожидаемом результате условия пропущен регион 4: правильный объект содержит также 4: 1.

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

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

Условие

Необходимо написать функцию, принимающую массив объектов и возвращающую объект‑отчёт, где ключами являются номера регионов, а значениями — количество субъектов в каждом из них. Дополнительные переменные‑массивы объявлять нельзя; функция должна сразу вернуть объект, сформированный из входных данных. Реализуйте всю логику внутри функции getResult.

const Task2 = () => {
    interface ISubjectRegion { name: string, region: number }
    interface IResult { [key: ISubjectRegion['region']]: number }

    const sourceData: ISubjectRegion[] = [
        { name: "Субъект 1", region: 1 },
        { name: "Субъект 2", region: 2 },
        { name: "Субъект 3", region: 2 },
        { name: "Субъект 4", region: 2 },
        { name: "Субъект 5", region: 4 }
    ]

    const expectedResult: IResult = {
        1: 1, //1 субъект в регионе 1
        2: 3 //3 субъекта в регионе 2
    }

    //!!! Логику реализовать внутри этой функции !!!
    const getResult = (data: ISubjectRegion[]): IResult => {
      //TODO
    }
    // Это выведет результат её работы справа
    return { expectedResult, result: getResult(sourceData) }
}
// Вспомогательные функции
const showTaskResult = (task: number, taskResult: { result: any, expectedResult: any }) => {
    console.log(`---Результат задачи ${task}---`)
    console.log('Ожидаемый: ', taskResult.expectedResult)
    console.log('Из функции: ', taskResult.result)
    console.log('')
}

// Это выведет результат её работы справа
showTaskResult(2, Task2())

Ответ

Используйте reduce с объектом-аккумулятором, увеличивая счётчик по region. В ожидаемом результате условия пропущен регион 4: правильный объект содержит также 4: 1.

const getResult = (data: ISubjectRegion[]): IResult => {
  return data.reduce<IResult>((result, { region }) => {
    result[region] = (result[region] ?? 0) + 1;
    return result;
  }, {});
};
// { 1: 1, 2: 3, 4: 1 }

Дополнительные массивы не создаются, вся логика находится внутри getResult. Номера регионов используются как ключи обычного объекта и в runtime становятся строками. Время O(n), память O(k) для k различных регионов; исходные записи не изменяются.

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

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

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

Подробнее