Функция форматирования изменяет структуру массива объектов

#javascript #arrays #json #object

#javascript #массивы #json #объект

Вопрос:

Я столкнулся с проблемами такого типа, каков наилучший способ ее решения. Я использовал map и reduce, но без каких-либо результатов. Заранее спасибо.

Предоставление этому массиву входных данных с этой структурой. Пример:

 [
{ 'id': 1, 'question_name': "What is your name?", 'question_value': "Jack"},
{ 'id': 2, 'question_name': "What is your hobby?", 'question_value': "Rugby"},
{ 'id': 3, 'question_name': "What is your name?", 'question_value': "Peter"},
{ 'id': 4, 'question_name': "What is your hobby?", 'question_value': "Tennis"}
]
  

Напишите функцию, которая преобразует этот массив в этот ВЫХОДНОЙ объект:

 {
"What is your name?": [{"id": 1, "value": "Jack" }, {"id": 3, "value": "Peter" }],
"What is your hobby?": [{"id": 2, "value": "Rugby"}, {"id": 4, "value": "Tennis"}]
}
  

У меня уже есть что-то подобное:

 const formatter = (o) => {
 const newObject = Object.keys(o).reduce(elm =>
  ({
    "What is your name?": [{'id': elm, 'value': elm}],
    "What is your hobby" : [{'id': elm, 'value': elm}],
  })
 )
 return newObject
  

Ответ №1:

Вы могли бы использовать reduce

 const data = [
  { id: 1, question_name: "What is your name?", question_value: "Jack" },
  { id: 2, question_name: "What is your hobby?", question_value: "Rugby" },
  { id: 3, question_name: "What is your name?", question_value: "Peter" },
  { id: 4, question_name: "What is your hobby?", question_value: "Tennis" },
]

const res = data.reduce((acc, { id, question_name, question_value: value }) => {
  if (acc[question_name]) {
    acc[question_name].push({ id, value })
  } else {
    acc[question_name] = [{ id, value }]
  }
  return acc
}, {})

console.log(res)  


Ссылка

Назначение деструктурирования

Array.prototype.reduce