Создайте объект из глубокого вложенного массива - PullRequest
0 голосов
/ 10 июля 2020

Данные userFavSportData, предоставляемые сервером, состоят из различных свойств:

[{
  "sport": 1,
  "favorites": [{
    "teams": [{
      "id": 123,
      "name_eng": "Mozambique",
      "name_rus": "Мозамбик",
      "short_name_eng": "Mozambique",
      "short_name_rus": "Мозамбик",
      "country": {
        "name_eng": "Mozambique",
        "name_rus": "Мозамбик"
      }
    }]
  }]
}, {
  "sport": 3,
  "favorites": [{
    "teams": [{
      "id": 2,
      "name_eng": "Golden State Warriors",
      "name_rus": "Голден Стэйт Уорриорз",
      "short_name_eng": "Warriors",
      "short_name_rus": "Уорриорз",
      "country": {
        "name_eng": "United States",
        "name_rus": "США"
      }
    }],
    "players": [{
      "id": 11,
      "firstname_eng": "Stephen",
      "lastname_eng": "Curry",
      "firstname_rus": "Стефен",
      "lastname_rus": "Карри",
      "team": {
        "name_eng": "Spartak Moscow",
        "name_rus": "Спартак Москва"
      }
    }, {
      "id": 11,
      "firstname_eng": "Stephen",
      "lastname_eng": "Curry",
      "firstname_rus": "Стефен",
      "lastname_rus": "Карри",
      "team": {
        "name_eng": "CSKA Moskva",
        "name_rus": "ЦСКА Москва"
      }
    }, {
      "id": 11,
      "firstname_eng": "Stephen",
      "lastname_eng": "Curry",
      "firstname_rus": "Стефен",
      "lastname_rus": "Карри",
      "team": {
        "name_eng": "Golden State Warriors",
        "name_rus": "Голден Стэйт Уорриорз"
      }
    }]
  }]
}]

Как сопоставить эти данные с объектом, состоящим из свойств sport и teams? То же самое с опорой players. И teams, и players могут отсутствовать в данных сервера.

Я мог бы сохранить данные teams prop для всего массива ответов сервера в переменной с

const teams: Teams = []

userFavSportData.forEach((a) => a.favorites
    .forEach((f) => f.teams?.forEach((t) => teams.push(t))))

но не смог сохранить все реквизиты данных сервера sport и teams в массиве тех же объектов, который содержит sport и teams для каждого go. Как я могу это сделать? Можно ли сделать это на одной карте в массиве данных сервера?

Желаемый результат:

[
  {
    sport: 1,
    country: Object,
    id: 123,
    name_eng: "Mozambique", 
    name_rus: "Мозамбик",
​​    short_name_eng: "Mozambique",
    short_name_rus: "Мозамбик",
  },
  ... ...
]

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Получил с функцией reduce.

const userFavSportData = [{
  "sport": 1,
  "favorites": [{
    "teams": [{
      "id": 123,
      "name_eng": "Mozambique",
      "name_rus": "Мозамбик",
      "short_name_eng": "Mozambique",
      "short_name_rus": "Мозамбик",
      "country": {
        "name_eng": "Mozambique",
        "name_rus": "Мозамбик"
      }
    }]
  }]
}, {
  "sport": 3,
  "favorites": [{
    "teams": [{
      "id": 2,
      "name_eng": "Golden State Warriors",
      "name_rus": "Голден Стэйт Уорриорз",
      "short_name_eng": "Warriors",
      "short_name_rus": "Уорриорз",
      "country": {
        "name_eng": "United States",
        "name_rus": "США"
      }
    }],
    "players": [{
      "id": 11,
      "firstname_eng": "Stephen",
      "lastname_eng": "Curry",
      "firstname_rus": "Стефен",
      "lastname_rus": "Карри",
      "team": {
        "name_eng": "Spartak Moscow",
        "name_rus": "Спартак Москва"
      }
    }, {
      "id": 11,
      "firstname_eng": "Stephen",
      "lastname_eng": "Curry",
      "firstname_rus": "Стефен",
      "lastname_rus": "Карри",
      "team": {
        "name_eng": "CSKA Moskva",
        "name_rus": "ЦСКА Москва"
      }
    }, {
      "id": 11,
      "firstname_eng": "Stephen",
      "lastname_eng": "Curry",
      "firstname_rus": "Стефен",
      "lastname_rus": "Карри",
      "team": {
        "name_eng": "Golden State Warriors",
        "name_rus": "Голден Стэйт Уорриорз"
      }
    }]
  }]
}]

var data = userFavSportData.reduce((array, item) => {
  var teams = item.favorites.map(item => item.teams?.map(item => item))[0][0]
  if (teams) array.push({sport: item.sport, ...teams})
  return array
}, [])
console.log(data)

Надеюсь, что это поможет.

1 голос
/ 10 июля 2020

В код просто добавлен объект sport из a.

const data = [
  {
    sport: 1,
    favorites: [
      {
        teams: [
          {
            id: 123,
            name_eng: "Mozambique",
            name_rus: "Мозамбик",
            short_name_eng: "Mozambique",
            short_name_rus: "Мозамбик",
            country: {
              name_eng: "Mozambique",
              name_rus: "Мозамбик",
            },
          },
        ],
      },
    ],
  },
  {
    sport: 3,
    favorites: [
      {
        teams: [
          {
            id: 2,
            name_eng: "Golden State Warriors",
            name_rus: "Голден Стэйт Уорриорз",
            short_name_eng: "Warriors",
            short_name_rus: "Уорриорз",
            country: {
              name_eng: "United States",
              name_rus: "США",
            },
          },
        ],
        players: [
          {
            id: 11,
            firstname_eng: "Stephen",
            lastname_eng: "Curry",
            firstname_rus: "Стефен",
            lastname_rus: "Карри",
            team: {
              name_eng: "Spartak Moscow",
              name_rus: "Спартак Москва",
            },
          },
          {
            id: 11,
            firstname_eng: "Stephen",
            lastname_eng: "Curry",
            firstname_rus: "Стефен",
            lastname_rus: "Карри",
            team: {
              name_eng: "CSKA Moskva",
              name_rus: "ЦСКА Москва",
            },
          },
          {
            id: 11,
            firstname_eng: "Stephen",
            lastname_eng: "Curry",
            firstname_rus: "Стефен",
            lastname_rus: "Карри",
            team: {
              name_eng: "Golden State Warriors",
              name_rus: "Голден Стэйт Уорриорз",
            },
          },
        ],
      },
    ],
  },
];

const teams = [];

data.forEach((a) =>
  a.favorites.forEach((f) =>
    f.teams?.forEach((t) => teams.push({ ...t, sport: a.sport }))
  )
);

console.log(teams);
...