Унификация структуры элементов массива

Для показанных трёх схем задайте явные правила: прямое name, body.name либо объединение name и lastname для person. Универсально угадывать смысл произвольных серверных полей нельзя.

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

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

Для показанных трёх схем задайте явные правила: прямое name, body.name либо объединение name и lastname для person. Универсально угадывать смысл произвольных серверных полей нельзя.

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

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

Условие

С сервера приходит массив объектов data, каждый из которых имеет свою уникальную схему полей. Требуется реализовать функцию flatData, принимающую массив data и возвращающую новый массив, где все элементы приведены к одинаковой структуре. В результирующем массиве каждый объект должен содержать только свойства id и name, где name берётся из исходного объекта независимо от того, было ли оно вложено в другой объект или находилось на верхнем уровне.

const data = [
  { id: 1, name: "siberia can code 📘" },
  { id: 2, body: { name: "siberia can code 📘" } },
  { id: 3, type: "person", name: "siberia", lastname: "can code 📘" },
];

const flatData = (data: any) => data;

// [
//   { id: 1, name: "siberia can code 📘" },
//   { id: 2, name: "siberia can code 📘" },
//   { id: 3, name: "siberia can code 📘" },
// ];

Ответ

Для показанных трёх схем задайте явные правила: прямое name, body.name либо объединение name и lastname для person. Универсально угадывать смысл произвольных серверных полей нельзя.

type Input = { id: number } & (
  { name: string; type?: string; lastname?: string } |
  { body: { name: string } }
);
function flatData(data: Input[]): { id: number; name: string }[] {
  return data.map(item => {
    const name = 'body' in item ? item.body.name
      : item.type === 'person' ? [item.name, item.lastname].filter(Boolean).join(' ')
      : item.name;
    return { id: item.id, name };
  });
}

Результат содержит только id и name, исходные данные не меняются. Третий элемент объединяет два поля согласно ожидаемому примеру. Для новой схемы нужно добавить адаптер, а для неизвестного JSON — проверку на границе API, не только аннотацию TypeScript.

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

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

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

Подробнее