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:
- Loop through the list of quizzes.
- Get list of keys in each object.
- 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);