Для показанных трёх схем задайте явные правила: прямое 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.