Преобразование массива с объектами

#javascript #arrays #object

Вопрос:

У меня есть массив с данными:

 const data = [
  {
    groupName: 'groupName1',
    types: [
      {
        name: 'name1',
        displayName: 'displayName1'
      },
      {
        name: 'name2',
        displayName: 'displayName2'
      },
    ]
  },
  {
    groupName: 'groupName2',
    types: [
      {
        name: 'name3',
        displayName: 'displayName3'
      },
      {
        name: 'name4',
        displayName: 'displayName4'
      },
    ]
  },
]
 

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

 const resultData = [
  {
    groupName: 'groupName1',
    name: 'name1',
    displayName: 'displayName1'
  },
  {
    groupName: 'groupName1',
    name: 'name2',
    displayName: 'displayName2'
  },
  {
    groupName: 'groupName2',
    name: 'name3',
    displayName: 'displayName3'
  },
  {
    groupName: 'groupName2',
    name: 'name4',
    displayName: 'displayName4'
  },
]
 

Я попытался сделать это с помощью метода массива карт

 const data = [{"groupName":"groupName1","types":[{"name":"name1","displayName":"displayName1"},{"name":"name2","displayName":"displayName2"}]},{"groupName":"groupName2","types":[{"name":"name3","displayName":"displayName3"},{"name":"name4","displayName":"displayName4"}]}]

const resultData = data.map((item) => {
  item.types.map((item1) => {
    return {
      ...item1,
      groupName: item.groupName
    }
  })

  return item
})

console.log(resultData) 

Но это не возвращает массив, который мне нужен. Пожалуйста, скажите мне, как я могу преобразовать этот массив, чтобы каждый объект имел правильную структуру? Заранее благодарю вас!

Ответ №1:

Замените внешний Array.map() вызов Array.flatMap() на создание плоского массива и верните результат внутреннего вызова карты, а не исходный элемент.

 const data = [{"groupName":"groupName1","types":[{"name":"name1","displayName":"displayName1"},{"name":"name2","displayName":"displayName2"}]},{"groupName":"groupName2","types":[{"name":"name3","displayName":"displayName3"},{"name":"name4","displayName":"displayName4"}]}]

const resultData = data.flatMap(({ types, groupName }) => 
  types.map(item => ({
    ...item,
    groupName
  }))
)

console.log(resultData) 

Ответ №2:

Я бы использовал reduce .

 data.reduce((carry, {types, groupName}) => carry.concat(types.map(d => ({...d, groupName}))), []);