2017-10-06 2 views
2

J'ai la suite comme entréeTransposition en Javascript

[ 
    { 
    "level1": [ 
     { "subject": "English", "avgScore": 100% }, 
     { "subject": "Math", "avgScore": 80% } 
    ] 
    }, 
    { 
    "level2": [ 
     { "subject": "English", "avgScore": 90% }, 
     { "subject": "Math", "avgScore": 75% } 
    ] 
    }, 
    { 
    "level3": [ 
     { "subject": "English", "avgScore": 100% }, 
     { "subject": "Math", "avgScore": 80% }, 
     { "subject": "Science", "avgScore": 90% } 
    ] 
    }, 
    { 
    "level4": [ 
     { "subject": "Math", "avgScore": 80% }, 
     { "subject": "Science", "avgScore": 90% } 
    ] 
    }, 
    { 
    "level5": [ 
     { "subject": "Computer", "avgScore": 80% } 
    ] 
    } 
] 

et je suis en train de convertir en la forme suivante

[ 
     { 
     label: "English", 
     values:[ 
      { grade: "level1", avgScore: 100% }, 
      { grade: "level2", avgScore: 90% }, 
      { grade: "level3", avgScore: 100% } 
     ] 
     }, 
     { 
     label: "Math", 
     values:[ 
      { grade: "level1", avgScore: 80% }, 
      { grade: "level2", avgScore: 75% }, 
      { grade: "level3", avgScore: 80% }, 
      { grade: "level4", avgScore: 80% } 
     ] 
     }, 
     { 
     label: "Science", 
     values:[ 
      { grade: "level3", avgScore: 90% }, 
      { grade: "level4", avgScore: 90% } 
     ] 
     }, 
     { 
     label: "Computer", 
     values:[ 
      { grade: "level5", avgScore: 80% } 
     ] 
     } 
    ] 

Jusqu'à présent, j'ai le code suivant qui ne me donne pas le tableau des valeurs

convert(inputFormat) { 
    const subjects = Array.from(inputFormat.reduce((acc, subject) => { 
    const level = Object.keys(subject)[0]; 
    subject[level].forEach((levelZone) => { 
     acc.add(levelZone.subject); 
    }); 
    return acc; 
    }, new Set())); 

    return subjects.map((subject) => { 
    return { 
     label: subject, 
     values: inputFormat.map((subject) => { 
     return Object.keys(subject)[0] 
     }, []); 
    } 
    }); 
} 
+5

Est-ce le code réel? Vos pourcentages ne sont pas enveloppés comme des chaînes et cette fonction génère des erreurs de syntaxe. – Phix

Répondre

0

Vous pouvez itérer le tableau d'entrée au sein de .map() pour vérifier si subject est égal à un nom de propriété d'un objet, si elle est vraie valeur .push()"avgScore" et le nom de la propriété fixée à "grade" au nom de la propriété

const input = [{ 
 
    "level1": [{ 
 
     "subject": "English", 
 
     "avgScore": "100%" 
 
     }, 
 
     { 
 
     "subject": "Math", 
 
     "avgScore": "80%" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "level2": [{ 
 
     "subject": "English", 
 
     "avgScore": "90%" 
 
     }, 
 
     { 
 
     "subject": "Math", 
 
     "avgScore": "75%" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "level3": [{ 
 
     "subject": "English", 
 
     "avgScore": "100%" 
 
     }, 
 
     { 
 
     "subject": "Math", 
 
     "avgScore": "80%" 
 
     }, 
 
     { 
 
     "subject": "Science", 
 
     "avgScore": "90%" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "level4": [{ 
 
     "subject": "Math", 
 
     "avgScore": "80%" 
 
     }, 
 
     { 
 
     "subject": "Science", 
 
     "avgScore": "90%" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "level5": [{ 
 
     "subject": "Computer", 
 
     "avgScore": "80%" 
 
    }] 
 
    } 
 
]; 
 

 
function convert(inputFormat) { 
 
    return Array.from(
 
    [...new Set(
 
     inputFormat.map(prop => { 
 
     const [{subject}] = prop[Object.keys(prop).pop()]; 
 
     return subject 
 
     }) 
 
    ) 
 
    ] 
 
    , label => { 
 
     const values = []; 
 
     for (const prop of inputFormat) { 
 
     for (const [grade, props] of Object.entries(prop)) { 
 
      for (const {subject, avgScore} of props) { 
 
      label === subject && values.push({avgScore, grade}) 
 
      } 
 
     } 
 
     } 
 
     return {label, values} 
 
    }) 
 
} 
 

 
console.log(convert(input));