Как преобразовать массив JSON объектов в JavaScript

Получаю данные из API и нужно их переформатировать

Приходит массив JSON объектов от сервера, и мне нужно его упростить. Хочу извлечь данные из вложенного объекта UserData (поля от ID до Location) и объединить их с полями верхнего уровня (от answer1 до Comments).

Вот что приходит:

[
    {
        "metadata": {
            "category": "Report",
            "endpoint": "/api/data/reports/12345"
        },
        "UserData": {
            "metadata": {
                "category": "User",
                "endpoint": "/api/data/users/67890"
            },
            "ID": "usr_001",
            "Form_Version": "3.1",
            "Request_Type": "Email",
            "Date_Created": "2025-03-15",
            "Status_Active": true,
            "Location": "Moscow"
        },
        "answer1": "Пример первого ответа",
        "answer2": true,
        "answer3": false,
        "Comments": "Тестовые комментарии"
    }
]

А нужно получить:

[
    {
        "ID": "usr_001",
        "Form_Version": "3.1",
        "Request_Type": "Email",
        "Date_Created": "2025-03-15",
        "Status_Active": true,
        "Location": "Moscow",
        "answer1": "Пример первого ответа",
        "answer2": true,
        "answer3": false,
        "Comments": "Тестовые комментарии"
    }
]

Пробовал разные варианты с map и forEach, но результат не тот. Как лучше это сделать?

Можно еще проще через Object.assign сделать. Я обычно так делаю когда нужно быстро склеить объекты:

const transformed = originalData.map(item => {
  return Object.assign({}, item.UserData, {
    answer1: item.answer1,
    answer2: item.answer2, 
    answer3: item.answer3,
    Comments: item.Comments
  });
});

Только не забудь убрать metadata из UserData если он там есть. Object.assign перезапишет повторяющиеся ключи, так что порядок важен.

У тебя проблема в том, что нужно правильно извлечь поля из вложеного объекта UserData и скомбинировать с остальными полями. Попробуй такой подход:

const result = data.map(item => {
  const { UserData, metadata, ...otherFields } = item;
  const { metadata: userMetadata, ...userData } = UserData;
  return { ...userData, ...otherFields };
});

Здесь используется деструктуризация - сначала выделяем UserData и убираем лишние metadata, потом извлекаем нужные поля из UserData и объединяем с остальными полями через spread оператор. Должно работать как надо!