Home > database >  How do i spread the objects inside an array of objects?
How do i spread the objects inside an array of objects?

Time:04-20

Below I added some details about the original data and the expected output also added the code I tried.

The JSON Original data I have

original_data = [
      {
        question_name: "What is this question for?",
        description: "This is a description",
        type: "Multi choice",
        answers: [
          {
            option: "opt1",
            score: 2,
          },
          {
            option: "opt2",
            score: 4,
          },
          {
            option: "opt3",
            score: 5,
          },
        ],
      },
    ];

expected Output

expected_output = {
  Question: "What is this question for?",
  Description: "This is a description",
  Type: "Multi choice",
  option: "opt1",
  score: 2,
  option1: "opt2",
  score1: 4,
  option2: "opt3",
  score2: 5,
};

The Code I tried

const updated_qstnData = original_data.map((d) => {
  const {
    question_name,
    description,
    type,
    answers,
  } = d;

  return {
    Question: question_name,
    Description: question_description,
    Type: answer_type,
  };
});

According to the code which I tried, I was able to create an object with a Question, Description, and Type but don't know how to pick the key/value from the answers array of objects and add them to the object (updated_qstnData) that I am creating

How do I spread out the answers key/value to my output object?

CodePudding user response:

You can try this solution

const original_data = [
      {
        question_name: "What is this question for?",
        description: "This is a description",
        type: "Multi choice",
        answers: [
          {
            option: "opt1",
            score: 2,
          },
          {
            option: "opt2",
            score: 4,
          },
          {
            option: "opt3",
            score: 5,
          },
        ],
      },
    ];

const updated_qstnData = original_data.map((d) => {
  const {
    question_name,
    description,
    type,
    answers,
  } = d;
  
  const result = {
    Question: question_name,
    Description: description,
    Type: type,
  }
  
  const answerObject = answers.reduce((answerData, currentAnswer, index) => {
      const optionKey = index ? "option"   index : "option"
      const scoreKey = index ? "score"   index : "score"
      return {
      ...answerData,
      [optionKey]: currentAnswer.option,
      [scoreKey]: currentAnswer.score
      }
  }, {})

  return {
    ...result,
    ...answerObject
  };
});

console.log(updated_qstnData)
.as-console-wrapper { max-height: 100% !important; top: 0; }

CodePudding user response:

You can flat map the answers array to object entries and adjust the keys as necessary.

For example...

const original_data = [{"question_name":"What is this question for?","description":"This is a description","type":"Multi choice","answers":[{"option":"opt1","score":2},{"option":"opt2","score":4},{"option":"opt3","score":5}]}];

const updated_qstnData = original_data.map(q => ({
  Question: q.question_name,
  Description: q.description,
  Type: q.type,
  ...Object.fromEntries(
    q.answers.flatMap(({ option, score }, i) => {
      const suffix = i > 0 ? i : "";
      return [
        [ `option${suffix}`, option ],
        [ `score${suffix}`, score ]
      ]
    })
  )
}));

console.log(updated_qstnData);
.as-console-wrapper { max-height: 100% !important; }

CodePudding user response:

You can't have two keys with the same name in an object so perhaps you can use a number suffix as follows:

const 
original_data = [ { question_name: "What is this question for?", description: "This is a description", type: "Multi choice", answers: [ { option: "opt1", score: 2, }, { option: "opt2", score: 4, }, { option: "opt3", score: 5, } ] } ],

updated_qstnData = original_data.map((d) => {
  const {
    question_name,
    description,
    type,
    answers
  } = d;

  return {
    Question: question_name,
    Description: description,
    Type: type,
    ...answers.reduce(
        (acc,{option,score},i) => 
        ({...acc,[`option_${i 1}`]:option,[`score_${i 1}`]:score}), {}
    )
  };
});

console.log( updated_qstnData[0] );

  • Related