J'ai un tableau de chaînes: où chaque chaîne a une signification. Par exemple, si nous considérons la première chaîne I.e., Maintenant, je veux le convertir en un tableau d'objets comme les suivants - P> "aa-q1-true" code>
Ici, la première partie -
aa code> est la réponse du quiz, la partie centrale -
q1 code> est la question et
true code>, la dernière partie est l'état de la réponse. Le statut peut être
true code> ou
false code>. Cette règle s'applique à chacune des chaînes à l'intérieur de la matrice. P>
[
0: [{
quizAns: [{aa: true}, {bb: false}, {cc: true}]
quizQuestion: q1
}]
1: [{
quizAns: [{aa: true}, {xx: false}, {yy: true}]
quizQuestion: q2
}]
2: [{
quizAns: [{mm: true}, {mn: false}, {qr: false}]
quizQuestion: q3
}]
]
4 Réponses :
Vous voudriez diviser chaque article par p> - code>, puis vous obtenez le premier et le dernier élément pour obtenir votre objet de réponse, et le milieu pour obtenir la question qui lui appartient, alors vous venez d'itérativement. Construire la solution:
let ans = ["aa-q1-true", "bb-q1-false", "cc-q1-true", "aa-q2-true", "xx-q2-false", "yy-q2-true", "mm-q3-true", "mn-q3-false", "qr-q3-false"].map((s) => s.split('-')).reduce((carry, current) => {
let existingIndex = carry.findIndex((item) => item.quizQuestion === current[1]);
if (existingIndex === -1) {
carry.push({quizAns: [], quizQuestion: current[1]});
existingIndex = carry.length - 1;
}
carry[existingIndex].quizAns.push({[current[0]]: current[2]});
return carry;
}, []);
console.log(ans);
Une autre approche. A moins de boucler sur le tableau que l'autre réponse.
p>
let questions = { }; let ans = ["aa-q1-true", "bb-q1-false", "cc-q1-true", "aa-q2-true", "xx-q2-false", "yy-q2-true", "mm-q3-true", "mn-q3-false", "qr-q3-false"] .reduce((acc, curr) => { let elements = curr.split("-"); let obj = {}; obj[elements[0]] = elements[2]; if (questions[elements[1]]) { questions[elements[1]].push(obj); } else { questions[elements[1]]= [obj]; } }, {}) let result = []; for (let prop in questions) { result.push({ "quizAns": questions[prop], "quizQuestion": prop }); } console.log(result);
Une autre approche avec moins de code
Je ne suis pas un gros fan de Cette boucle fonctionnera, même si l'entrée se présente sous une manière brouillée. P> p> array.reduce code> Syntaxe Cause du facteur de lisibilité.
const a = ["aa-q1-true", "bb-q1-false", "cc-q1-true", "aa-q2-true", "xx-q2-false", "yy-q2-true", "mm-q3-true", "mn-q3-false", "qr-q3-false"];let results = [];
const retObj = (que, ans) => {
const obj = {};
obj[`${que}`] = ans;
return obj;
};
for (let i in a){
let currEleArr = a[i].split("-");
let tarInd = parseInt(currEleArr[1].split("")[1]) - 1;
let que = currEleArr[0];
let ans= currEleArr[2];
if (!results[tarInd])
results[tarInd] = [{quizAns: []}];
if(!results[tarInd][0].quizQuestion)
results[tarInd][0]["quizQuestion"] = `q${tarInd + 1}`;
results[tarInd][0].quizAns.push(retObj(que, ans));
}
console.log(results);