Home > Blockchain >  How to change the structure of JSON file
How to change the structure of JSON file

Time:12-03

P.S. Sorry if the task is easy, but I don't know the JS and poor in JSON

I have a JSON file with structure like this:

[
  {
    "id": 1,
    "quizId": 1,
    "question": "Какому автомобилю разрешается остановка в зоне действия этих знаков?",
    "answer_1": "Красному.",
    "answer_2": "Обоим автомобилям.",
    "answer_3": "Ни одному.",
    "answer_4": "Ни одному.",
    "answer_5": "Желтому, обозначенному опознавательным знаком \"Инвалид\".",
    "answer_6": "-",
    "correctAnswer": 4,
    "image": "1.jpg"
  },
  {
    "id": 2,
    "quizId": 1,
    "question": "По каким направлениям из числа обозначенных стрелками разрешается движение?",
    "answer_1": "Только по направлению А.",
    "answer_2": "Только по направлению Б.",
    "answer_3": "Только по направлению В.",
    "answer_4": "Только по направлению В.",
    "answer_5": "Только по направлению А и Г.",
    "answer_6": "Только по направлению Г.",
    "correctAnswer": 4,
    "image": "2.jpg"
  }
]

I want to group all answers to one nested object inside of main object. Like:

[
  {
    "id": 1,
    "quizId": 1,
    "question": "По каким направлениям из числа обозначенных стрелками разрешается движение?",
     "answers": {
       "Только по направлению А.",
       "Только по направлению Б.",
       "Только по направлению В.",
       "Только по направлению В.",
       "Только по направлению А и Г.",
       "Только по направлению Г."
     },
    "correctAnswer": 4,
    "image": "2.jpg"
  }
]

Thanks for every answers

Actually I am not JS coder, and knowledge in JSON is very leak, so I don't have mind hove to solve the problem.

CodePudding user response:

  1. Loop through the list of quizzes.
  2. Get list of keys in each object.
  3. Loop through the list of keys and if a key matches "answer_" add it to an array.

For example if you want keep original objects intact you can create a new object for each quiz in the array and copy values from the original:

const quizzes = [
  {
    "id": 1,
    "quizId": 1,
    "question": "Какому автомобилю разрешается остановка в зоне действия этих знаков?",
    "answer_1": "Красному.",
    "answer_2": "Обоим автомобилям.",
    "answer_3": "Ни одному.",
    "answer_4": "Ни одному.",
    "answer_5": "Желтому, обозначенному опознавательным знаком \"Инвалид\".",
    "answer_6": "-",
    "correctAnswer": 4,
    "image": "1.jpg"
  },
  {
    "id": 2,
    "quizId": 1,
    "question": "По каким направлениям из числа обозначенных стрелками разрешается движение?",
    "answer_1": "Только по направлению А.",
    "answer_2": "Только по направлению Б.",
    "answer_3": "Только по направлению В.",
    "answer_4": "Только по направлению В.",
    "answer_5": "Только по направлению А и Г.",
    "answer_6": "Только по направлению Г.",
    "correctAnswer": 4,
    "image": "2.jpg"
  }
];
//iterate through list of quizzes
const quizzesFixed = quizzes.map(quiz => 
{
  //get keys of each quiz object
  const keys = Object.keys(quiz);
  
  //iterate through the list of keys using reduce() function, which will return a new object;
  return keys.reduce((newObj, key) =>
  {
    //if key name starts with "answer_" add the value into array otherwise simply copy value as is.
    if (key.substring(0, 7) == "answer_")
    {
      //if it's a first time match, make sure the array exists
      if (newObj.answers === undefined)
        newObj.answers = [];

      newObj.answers.push(quiz[key]);
    }
    else
      newObj[key] = quiz[key];

    return newObj;
  }, {});
});

console.log(quizzesFixed);

Or, you can modify the original objects instead:

const quizzes = [
  {
    "id": 1,
    "quizId": 1,
    "question": "Какому автомобилю разрешается остановка в зоне действия этих знаков?",
    "answer_1": "Красному.",
    "answer_2": "Обоим автомобилям.",
    "answer_3": "Ни одному.",
    "answer_4": "Ни одному.",
    "answer_5": "Желтому, обозначенному опознавательным знаком \"Инвалид\".",
    "answer_6": "-",
    "correctAnswer": 4,
    "image": "1.jpg"
  },
  {
    "id": 2,
    "quizId": 1,
    "question": "По каким направлениям из числа обозначенных стрелками разрешается движение?",
    "answer_1": "Только по направлению А.",
    "answer_2": "Только по направлению Б.",
    "answer_3": "Только по направлению В.",
    "answer_4": "Только по направлению В.",
    "answer_5": "Только по направлению А и Г.",
    "answer_6": "Только по направлению Г.",
    "correctAnswer": 4,
    "image": "2.jpg"
  }
];

//iterate through list of quizzes
quizzes.map(quiz => 
{
  //get keys of each quiz object
  const keys = Object.keys(quiz);
  //iterate through the list of keys
  keys.map(key =>
  {
    //if key name starts with "answer_" add the value into array otherwise simply copy value as is.
    if (key.substring(0, 7) == "answer_")
    {
      //make sure "answers" array already exists
      if (quiz.answers === undefined)
        quiz.answers = [];
      // add "answer" to the array;
      quiz.answers.push(quiz[key]);
      //delete now unused old "answers_*" keys;
      delete quiz[key];
    }
  });
});

console.log(quizzes);

  • Related