【问题标题】:Mapping object property (column name) from Array of Objects to a row and header(column)Javascript将对象属性(列名)从对象数组映射到行和标题(列)Javascript
【发布时间】:2020-03-06 22:06:01
【问题描述】:

我目前正在使用 Materia-UI 表将一个对象数组(最初从 localStorage 创建)映射到一个表。

我想在表格单元格中映射所有特定的列名

例如,我有一个数组(它不在文件中)

var array = [{ date: '2019-02-11', bus_name: 'Thomas #1', driver_name: 'Sam', time_start: '9AM', time_end: '5PM' }, 
{ date: '2012-02-11', bus_name: 'Thomas #2', driver_name: 'Samantha', time_start: '8AM', time_end: '4PM'}, 
{ date: '2011-02-02', bus_name: 'Thomas #3', driver_name: 'Peter', time_start: '12PM', time_end: '7PM' }, { date: '2010-06-04', bus_name: 'Thomas #4', driver_name: 'Eddie', time_start: '11AM', time_end: '6PM' }, { date: '2017-02-11', bus_name: 'Thomas #5', driver_name: 'Raul', time_start: '4AM', time_end: '1PM' }, 
{ date: '2014-04-03', bus_name: 'Thomas #6', driver_name: 'Jessie', time_start: '5AM', time_end: '2PM' }]

我想使用该库创建一个表,或者您可以使用 th tr 或 td 标签,因为它适用于 React(下图)例如,列名称为 date 的所有名称都将转到 Date,和driver_name 将转到驱动程序。

【问题讨论】:

  • 你有一个初步的尝试吗?
  • 最初我为列创建了一个子数组,但它没有成功,因为它会给我 " " 和 , 值。

标签: javascript arrays reactjs object material-ui


【解决方案1】:

假设array 是你定义的数组。

<table>
  <thead>
    <tr>
      <th>Date</th>
      <th>Driver</th>
    </tr>
  </thead>
  <tbody>
    {array.map((element, index) => {
        return (
          <tr key={index}>
           <td>{element.date}</td>
           <td>{element.driver_name}</td>
          </tr>
        )
    })}
  </tbody>
</table>

我认为这应该可行ツ

【讨论】:

  • 它不起作用,它给了我一个错误''期望一个赋值或函数调用,而是看到一个表达式''
  • 您没有从地图返回。你需要给tr一个key
  • 所以我有 tr 我的密钥来回说 (element, tr => ...) 正确吗?
  • 箭头函数自动添加返回但你是对的我们应该在tr中添加一个唯一键
  • 不,它没有。使用() 会自动返回。你使用了{},所以你必须返回。
【解决方案2】:

假设您正在使用带有卡片组件的 Material-UI(您也可以跳过卡片组件),您可以使用如下代码:

import React, { useState } from 'react';
import clsx from 'clsx';
import { makeStyles } from '@material-ui/styles';
import {
  Card,
  CardActions,
  CardContent,
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableRow,
  TablePagination,
  Toolbar,
  Typography,
} from '@material-ui/core';

var rides = [{ date: '2019-02-11', bus_name: 'Thomas #1', driver_name: 'Sam', time_start: '9AM', time_end: '5PM' },
{ date: '2012-02-11', bus_name: 'Thomas #2', driver_name: 'Samantha', time_start: '8AM', time_end: '4PM'},
{ date: '2011-02-02', bus_name: 'Thomas #3', driver_name: 'Peter', time_start: '12PM', time_end: '7PM' }, { date: '2010-06-04', bus_name: 'Thomas #4', driver_name: 'Eddie', time_start: '11AM', time_end: '6PM' }, { date: '2017-02-11', bus_name: 'Thomas #5', driver_name: 'Raul', time_start: '4AM', time_end: '1PM' },
{ date: '2014-04-03', bus_name: 'Thomas #6', driver_name: 'Jessie', time_start: '5AM', time_end: '2PM' }];

const useStyles = makeStyles(theme => ({
  root: {},
  content: {
    padding: theme.spacing(2)
  },
  nameContainer: {
    display: 'flex',
    alignItems: 'center'
  },
  avatar: {
    marginRight: theme.spacing(2)
  },
  actions: {
    justifyContent: 'flex-end'
  },

  title: {
    flex: '1 1 100%',
  },
  table: {
    '& .MuiTableCell-root': {
      padding: 4,
    },
  },
}));

const RideTable = props => {
  //const { rides, ...rest } = props;
  const { className, ...rest } = props;

  const classes = useStyles();

  const [rowsPerPage, setRowsPerPage] = useState(10);
  const [page, setPage] = useState(0);


  const handlePageChange = (event, page) => {
    setPage(page);
  };

  const handleRowsPerPageChange = event => {
    setRowsPerPage(event.target.value);
  };

  return (
    <Card
      {...rest}
      className={clsx(classes.root, className)}
    >
      <CardContent className={classes.content}>
        <Toolbar>
          <Typography
            className={classes.title}
            variant="h6"
            id="tableTitle"
          >
            Rides
          </Typography>
        </Toolbar>
        <Table className={classes.table}>
          <TableHead>
            <TableRow>
              <TableCell>Date</TableCell>
              <TableCell>Driver</TableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {rides.map((ride, index) => (
              <TableRow
                className={classes.tableRow}
                hover
                key={'ride-' + index}
              >
                <TableCell>{ride.date}</TableCell>
                <TableCell>{ride.driver_name}</TableCell>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </CardContent>
      <CardActions className={classes.actions}>
        <TablePagination
          component="div"
          count={rides.length}
          onChangePage={handlePageChange}
          onChangeRowsPerPage={handleRowsPerPageChange}
          page={page}
          rowsPerPage={rowsPerPage}
          rowsPerPageOptions={[5, 10, 25]}
        />
      </CardActions>
    </Card>
  );
};


export default RideTable;

【讨论】:

    【解决方案3】:

    您正在寻找的是 Array.map() 函数, Array.map(callback) 将返回一个数组,其中以数组内容作为参数执行的回调的返回值:

    你可以创建一个函数来为一行创建 html 像

    function dataToTableRow(data){
        return `<tr><td>${data.date}</td><td>${data.driver_name}</td></tr>`
    }
    

    将此函数作为对 array.map 的回调:

    const rowsHtml = (array.map(dataToTableRow))
    

    将返回一个字符串数组,其中包含每一行的 HTML,您可以通过这样做将它们全部放在一个字符串中

    const tableBody = rowsHtml.join("")
    

    现在您已经拥有了 tableBody 中所有行的 html,您需要做的就是制作自己的标题等...

    【讨论】:

    • 这不是反应的好方法。表格元素必须是 JSX,而不是字符串文字。在纯 javascript 中这可能有效,但 react 不会将其呈现为 HTML,它将被转义并打印为字符串。
    • 这是真的,但是考虑到 OP 提供的少量信息,我并没有立即意识到他正在寻找一种复制和粘贴解决方案来进行反应(尽管我应该费心推断),而是专注于关于解释 Array.map() 的概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多