【问题标题】:Conditional table cell in mapped function React映射函数React中的条件表单元格
【发布时间】:2021-03-16 12:45:26
【问题描述】:

我有一个映射到表内的数组,我想检查对象属性“userName”是否与标题相同,以便我知道该值的放置位置,否则应显示为“0”。

下面是映射完成后的表格:

{report.data.map(obj => (
                  <React.Fragment>
                    <TableCell>{obj.userName === users[0] ? obj.workedHours : "0"}</TableCell>
                    <TableCell>{obj.userName === users[1] ? obj.workedHours : "0"}</TableCell>
                    <TableCell>{obj.userName === users[2] ? obj.workedHours : "0"}</TableCell>
                  </React.Fragment>
                ))}

在映射函数中,users 就是用户喜欢的数组

users = ["User 1", "User 2", "User 3"]

report.data 是每个项目的对象数组:

[{userName: "User 1", rate: 5, clientName: "client A", workedHours: 8},
 {userName: "User 2", rate: 3, clientName: "client B", workedHours: 5}]

表格的结束方式如下:

你能帮我在它存在的地方显示每个用户的价值,否则显示“0”吗?

感谢您的宝贵时间

【问题讨论】:

  • 你的report.data是什么样的?
  • 编辑了帖子以显示report.data 的样子。谢谢提醒
  • 你看到大小写的不同了吗? "User 1" === "user 1" 将始终为 false,因为大写的 "U"。
  • 我想你只需要obj.userName.toLowerCase() === users[0].toLowerCase()
  • @BjørnNyborg 从这个角度来看,真实数据还可以,这里只是举例,但谢谢,我更正了

标签: javascript arrays reactjs material-ui


【解决方案1】:

我已经创建了一个反应示例。

我还通过迭代标题列的用户来使其更加动态。

如果用户一直在多个客户端上工作,数据会是什么样子?

const users = ["User 1", "User 2", "User 3"];

const projects = [
  {
    projectName: "project 1", 
    data: [
      {userName: "User 1", rate: 5, clientName: "client A", workedHours: 8},  
      {userName: "User 2", rate: 3, clientName: "client B", workedHours: 5}
    ]
  }, 
  {
    projectName: "project 2", 
    data: [
      {userName: "User 3", rate: 6, clientName: "client A", workedHours: 5}
    ]
  }
]

ReactDOM.render(
  <table>

    <tr>
      <td>Project:</td>
      {users.map(user => (
        <td><span>{user}</span></td>
      ))}
    </tr>

    {projects.map(project => (
      <tr>
        <td><span>{project.projectName}</span></td>

         {users.map(user => {
          
          // Filter for only users that has worked on the project
          const usersOnProject = project.data.filter(obj => obj.userName === user)
          
          // If there is users on the project, iterate them
          if(usersOnProject.length) {
            return (
              <td>
                {usersOnProject.map(obj => obj.userName === user && obj.workedHours)}
              </td>
            )
          }
          
          // Else if no users on the project, return 0
          return (
            <td>0</td>
          )
        })}
      </tr>
    ))}

  </table>,
  document.getElementById('root')
);
table {
  border-collapse: collapse;
  font-family: sans-serif;
  font-size: 14px;
}
table td + td, table th + th {
  text-align: center;
  border-collapse:
}

span {
  color: red;
}

td, th {
  padding: 3px;
  border-bottom: 1px solid #ccc;
}
<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>

【讨论】:

  • 你给了我一个映射用户的想法,但问题不在于 clientName 尚未使用,只是存在于对象中,但如果更多用户在同一个项目上工作。正如您在问题中所附的照片中看到的那样,即使在{report.data.map(obj =&gt; ( users.map(user =&gt; ( &lt;TableCell&gt;{obj.userName === user ? obj.workedHours : "0"}&lt;/TableCell&gt; ) )))}
  • 如果您有多个用户,在同一个项目上工作,您能否提供一个数据示例?
  • 我的第一个对象数组是这样的:[{projectName: "project 1", data: [{userName: "User 1", rate: 5, clientName: "client A", workedHours: 8}, {userName: "User 2", rate: 3, clientName: "client B", workedHours: 5}]}, {projectName: "project 2", data: [{userName: "User 3", rate: 6, clientName: "client A", workedHours: 5}]}。从这里我使用 projectName 作为每一行的第一个单元格,然后将数据映射到相应用户下每小时显示一次
  • @VladPopa 我已经用提供的数据示例更新了答案。 ?
  • 你是个救命稻草,感谢你的时间和兴趣,它按预期工作,我明白它应该如何制作:D
猜你喜欢
  • 1970-01-01
  • 2018-12-01
  • 2019-07-26
  • 1970-01-01
  • 2015-10-29
  • 2022-12-31
  • 2019-10-20
  • 2018-12-06
  • 2021-02-22
相关资源
最近更新 更多