@campus1

Как распарсить и сделать некий merge объектов??

Всем привет. Есть у меня такие данные:
Объект вопросов
[
  {
    id: 1,
    step: 1,
    key: "q_13",
    question: { en: "How are you?" },
    answer: {
      type: "single",
      subtype: "list",
      values: {
        1: { en: "I'm okay" },
        2: { en: "Bad" }
      }
    }
  },
  {
    id: 2,
    key: "q_14",
    step: 1,
    question: { en: "How old are you?" },
    answer: {
      type: "single",
      subtype: "list",
      values: {
        1: { en: "22" },
        2: { en: "23" },
        3: { en: "35" }
      }
    }
  },
  {
    id: 3,
    step: 2,
    key: "q_15",
    question: { en: "Your height?" },
    answer: {
      max: 100,
      min: 0,
      subtype: "range",
      type: "single"
    }
  }
];
Объект ответов
{
  "q_15" : {step: 2, answer: "62"},
  "q_14" : {step: 1, answer: "2"}, // то есть ответ был 23
  "q_13" : {step: 1, answer: "1"} // ответ I'm okay
}

Мне нужно распарсить это в массив по типу:
[
  // Ключи - это цифра step, потому как мне надо отображать вопросы и ответы согласно step'у в котором он был
  1: [
    {step: 1, question: { en: "How are you?" }, answer: "I'm okay", }, 
    {step: 1, question: {en: "How old are you?"}, answer: "23" }
  ],
  2: [
    {step: 2, question: { en: "Your height?" }, answer: "62"}
  ]
]

Первоначальный алгоритм:
То есть мне нужно пройти циклом по массиву объектов вопросов и сравнить ключи (key) с ключами объекта ответов, если совпали ключи, то делать какой-то merge что-ли по answers.

Подскажите пожалуйста алгоритм или подкиньте мыслю?
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const steps = Object.entries(answers).reduce((acc, [ key, val ]) => {
  const question = questions.find(n => n.key === key);
  const step = acc[val.step] = acc[val.step] || [];

  step.push({
    step: val.step,
    question: { ...question.question },
    answer: question.answer.values instanceof Object
      ? question.answer.values[val.answer].en
      : val.answer,
  });

  return acc;
}, {});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы