0
votes

Convertir une gamme de chaînes en une matrice d'objets où chaque chaîne elle-même a un séparateur

J'ai un tableau de chaînes: xxx pré>

où chaque chaîne a une signification. Par exemple, si nous considérons la première chaîne I.e., "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>

Maintenant, je veux le convertir en un tableau d'objets comme les suivants - 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
    }]
]


0 commentaires

4 Réponses :


3
votes

Vous voudriez diviser chaque article par - 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:

p>

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);


0 commentaires

1
votes

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);


0 commentaires

2
votes

Une autre approche avec moins de code xxx


0 commentaires

1
votes

Je ne suis pas un gros fan de array.reduce code> Syntaxe Cause du facteur de lisibilité.

Cette boucle fonctionnera, même si l'entrée se présente sous une manière brouillée. P>

p>

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);


0 commentaires