我有像下面这样的数据,有随机的行数(三级),我想循环这个数据来显示它像下面的表格

enter image description here enter image description here

enter image description here

const myData = [
  {
    subject: "Math",
    class: [
      {
        name: "Math-01",
        results: [
          {student: "jame",score: "10"},
          {student: "kelvin",score: "4"},
          { student: "smith",score: "8"}
        ]
      },
      {
        name: "Math-02",
        results: [
          { student: "joe",score: "8"},
          {student: "yassou",score: "8"}
        ]
      }
    ]
  },
  {
    subject: "History",
    class: [
      {
        name: "History-01",
        results: [
          {student: "zoe", score: "6"},
          {student: "jame", score: "8"},
          {student: "bean", score: "9"}
        ]
      },
      {
        name: "History-02",
        results: [
          {student: "luffy", score: "10"},
        ]
      }
    ]
  },
  {
    subject: "literature",
    class: [
      {
        name: "literature-01",
        results: [
          {student: "nami", score: 5}
        ]
      },
      {
        name: "literature-02",
        results: [
          {student: "zoro", score: 3}
        ]
      },
      {
        name: "literature-03",
        results: [
          {student: "shank", score: 5}
        ]
      }
    ]
  }
]

我试着用这种方法 https://codesandbox.io/s/material-ui-table-demo-with-row-span-dq1w6个 但它只适用于第二级

here is my code at level 2 and it work enter image description here enter image description here

and I continue apply this logic for level 3 and it's not working properly enter image description here enter image description here

有没有人能帮我换一种方法,我希望表格看起来像我的数据中的第一张图片.

(*)注意:mydata可以有更多不同行数的数据,所以我希望能够动态地构建合并单元格表(但它仍然是相同的格式)

非常感谢.

推荐答案

const myData = [
  {
    subject: "Math",
    class: [
      {
        name: "Math-01",
        results: [
          {student: "jame",score: "10"},
          {student: "kelvin",score: "4"},
          { student: "smith",score: "8"}
        ]
      },
      {
        name: "Math-02",
        results: [
          { student: "joe",score: "8"},
          {student: "yassou",score: "8"}
        ]
      }
    ]
  },
  {
    subject: "History",
    class: [
      {
        name: "History-01",
        results: [
          {student: "zoe", score: "6"},
          {student: "jame", score: "8"},
          {student: "bean", score: "9"}
        ]
      },
      {
        name: "History-02",
        results: [
          {student: "luffy", score: "10"},
        ]
      }
    ]
  },
  {
    subject: "literature",
    class: [
      {
        name: "literature-01",
        results: [
          {student: "nami", score: 5}
        ]
      },
      {
        name: "literature-02",
        results: [
          {student: "zoro", score: 3}
        ]
      },
      {
        name: "literature-03",
        results: [
          {student: "shank", score: 5}
        ]
      }
    ]
  },
  {
    subject: "literature",
    class: [
      {
        name: "literature-01",
        results: []
      },
      {
        name: "literature-02",
        results: [ {student: "zoro", score: 3} ]
      },
      {
        name: "literature-03",
        results: [ {student: "shank", score: 5} ]
      }
    ]
  }
];

function App() {
  return (
    <table>
      {
        myData.map((record, i) => {
          let subjectHandled = false;
          return record.class.map((course, j) => {
            return course.results.map((r, k) => {
              let subjectTdEl;
              
              if (!subjectHandled && k === 0) {
                let resultsCount = 0;
                
                record.class.forEach((c) => {
                  resultsCount += c.results.length;
                });
                
                subjectTdEl = <td rowSpan={resultsCount}>{record.subject}</td>
                
                subjectHandled = true;
              }
              
              let courseTdEl;
              if (k === 0) {
                courseTdEl = <td rowSpan={course.results.length}>{course.name}</td>;
              }
              
              return (
                <tr key={k}>
                  {subjectTdEl}       
                  {courseTdEl}
                  <td>{r.student}</td>
                  <td>{r.score}</td>
                </tr>
              );
            });
          });
        })
      }
    </table>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));
table {
  font-family: verdana;
  border-collapse: collapse;
}

table, th, td {
  padding: 10px;
  border: 1px solid black;
  text-align: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

Javascript相关问答推荐

验证嵌套 colored颜色 代码的结果

使用Astro和React的动态API

以逗号分隔的列表来数组并填充收件箱列表

试图为每支球队生成类似于2024/25年欧洲足联冠军联赛瑞士系统格式的独特比赛配对

为什么在集内和集外会产生不同的promise 状态(使用Promise.race)?

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

仅圆角的甜甜圈图表

Vega中的模运算符

if/else JavaScript中的条件行为

格式值未保存在redux持久切片中

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

Snowflake JavaScript存储过程返回成功,尽管预期失败

我可以从React中的出口从主布局调用一个处理程序函数吗?

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

如何修复(或忽略)HTML模板中的TypeScript错误?'

当点击注册页面上的注册按钮时,邮箱重复

如何根据当前打开的BottomTab Screeb动态加载React组件?

用于编辑CSS样式的Java脚本

将Node.js包发布到GitHub包-错误ENEEDAUTH

背景动画让网站摇摇欲坠