在Javascript中转置

时间:2017-10-06 22:50:28

标签: javascript algorithm sorting

我有以下输入

[
  {
    "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% }
    ]
  }
]

我正在尝试转换为以下形式

    [
      {
        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% }
        ]
      }  
    ]

到目前为止,我有以下代码,它没有给我数组值

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]
      }, []);
    }
  });
}

1 个答案:

答案 0 :(得分:0)

您可以在.map()内迭代输入数组,以检查subject是否等于对象的属性名称,如果值为.push() "avgScore"并且属性名称设置为在"grade"到属性名称



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