【问题标题】:How to display data from 2 separate arrays in one table in React Js?如何在 React Js 的一个表中显示来自 2 个单独数组的数据?
【发布时间】:2021-06-28 16:22:35
【问题描述】:

在我的项目中,我需要在一个表中显示来自 2 个单独数组的数据,并且我需要让我的代码具有响应性,我的代码:

import "./styles.css";

export default function App() {
  const data = [
    {
      v: "car"
    },
    {
      v: "model"
    },
    {
      v: "accident"
    },
    {
      v: "owner"
    }
  ];

  const info = [
    {
      year: "2010",
      model: "bmv",
      accident: "2019",
      owner: "J.S"
    },
    { 
      year: "2012", 
      model: "bmv", 
      accident: "n/a", 
      owner: "D.W" },
    { 
      year: "2014", 
      model: "bmv", 
      accident: "2016", 
      owner: "J.B" 
    }
  ];
  return (
    <div className="App">
      <table>
        <tr>
          {data?.map((d, i) => (
            <td>{d.v}</td>
          ))}

          {info.map((d) => (
            <>
              <td>{d.year}</td>
              <td>{d.model}</td>
              <td>{d.accident}</td>
              <td>{d.owner}</td>
            </>
          ))}
        </tr>
      </table>
    </div>
  );
}


codeSandbox

我正在映射两个数组,结果显示如下:

car model   accident    owner   2010    bmv 2019    J.S 2012    bmv n/a D.W 2014    bmv 2016    J.B

但我需要的结果是:

car  2010           2012       2014

model bmv            bmv       bmv

accident 2019        n/a        2016

owner J.S            D.W      J.B

另一个问题是我不想在

中指定 {d.year} 或 {d.model
{info.map((d) => (
            <td>{d.year}</td>
            <td>{d.model}</td>
            <td>{d.accident}</td>
             <td>{d.owner}</td>
          ))}

因为当/如果添加新值(如 lastOwner),除非我指定 {d.lastOwner},否则它不会显示

有没有什么方法可以实际组合来自 2 个数组的数据,并且只映射所有值而不指定它们?非常感谢任何建议和帮助。

【问题讨论】:

    标签: javascript arrays reactjs html-table


    【解决方案1】:

    您可以使用数据数组来遍历每个信息条目的属性。

    https://codesandbox.io/s/zealous-thunder-zoeqp?file=/src/App.js

    <table>
            {/* <tr>
              {data.map((d, i) => (
                <th>{d.v}</th>
              ))}
            </tr> */}
            {info.map((entry, i) => (
              <tr>
                {data.map((d, i) => (
                  <>
                    {entry[d.v] && (
                      <td>
                        <strong>{d.v} :</strong>
                        {entry[d.v]}
                      </td>
                    )}
                  </>
                ))}
              </tr>
            ))}
          </table>
    

    【讨论】:

    • 您好,感谢您的帮助。这样数据值不会与信息值显示在同一行中,我需要将它们显示在行中
    • 我想我现在明白你想要什么了。我更新了代码框和我的答案
    【解决方案2】:

    我不确定你不想显示 d.year 和 d.model 是什么意思。 但是要回答您关于如何基本上转置表格的问题,您可以使用以下内容:

    您基本上使用数据表中的值来打印属于它的信息表中的值。因此,如果您向其添加更多数据,它仍应打印此内容。

    我使用条件语句,因为汽车和年份不同(这可能与我不理解的您的信息有关)。所以如果是汽车,那么它应该打印出年份。

    return (
    <div className="App">
      <table>
        {data?.map((value) => (
          <tr>
            <th>{value.v}</th>
            {info.map((info_value) => (
              <>
                <td>
                  {value.v === "car" ? info_value.year : info_value[value.v]}
                </td>
              </>
            ))}
          </tr>
        ))}
        <tr></tr>
      </table>
     </div>
    );
    

    由于我不确定您如何将数据添加到表格中,或者除了您在问题中显示的内容之外,您究竟想要打印什么,我不确定这是否正是您要查找的内容。但它应该打印出以下内容:

    car      2010  2012 2014
    model    bmv   bmv  bmv
    accident 2019  n/a  2016
    owner    J.S   D.W  J.B
    

    【讨论】:

    • 嗨,谢谢您的代码,它可以工作,但是如果 value.v === "car", "car" 更改为另一个值,代码将无法工作,或者我需要更改代码,有没有办法在不指定“汽车”的情况下显示信息值。我希望保留 1 行代码,例如 {info_value[value.v]} 以显示所有信息值
    • 好的。请问为什么第一个键与您的信息数组中的键不对应?就像,为什么要值“汽车”(在您的示例中)显示“年份”?您应该使密钥彼此保持一致,以使您的代码更具可重用性。我想我明白你的问题是什么,但我不明白为什么表格会发生变化,如果发生变化,为什么它们不能相互对应?
    【解决方案3】:

    这只是 html 表中的一个问题,我放置了内联样式以适合您的 ui 规范,但您可以在 css 样式表中添加此样式:

    import "./styles.css";
    
    export default function App() {
      const data = [
        {
          v: "car"
        },
        {
          v: "model"
        },
        {
          v: "accident"
        },
        {
          v: "owner"
        }
      ];
    
      const info = [
        {
          year: "2010",
          model: "bmv",
          accident: "2019",
          owner: "J.S"
        },
        {
          year: "2012",
          model: "bmv",
          accident: "n/a",
          owner: "D.W"
        },
        {
          year: "2014",
          model: "bmv",
          accident: "2016",
          owner: "J.B"
        }
      ];
      return (
        <div className="App">
          <table style={{ display: "flex" }}>
            <thead style={{ display: "flex", flexDirection: "column" }}>
              <tr style={{display:"flex", flexDirection:"column", margin:"5px"}}>
                {data?.map((d, i) => (
                  <th key={i}>{d.v}</th>
                ))}
              </tr>
            </thead>
            <tbody style={{ display:"flex"}}>
              {info.map((d, i) => (
                <tr key={i} style={{display:"flex", flexDirection:"column", margin:"5px"}}>
                  <td>{d.year}</td>
                  <td>{d.model}</td>
                  <td>{d.accident}</td>
                  <td>{d.owner}</td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      );
    }
    
    

    【讨论】:

    • 谢谢你的代码,它可以工作,但我仍然需要指定``` {d.year} {d.model} {d.accident} {d.owner}``` 每一次,有没有办法可以在 1 行代码中映射所有值?比如如果添加新数据(比如 lastOwner),我需要添加额外的代码 {d.lastOwner}`
    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2019-07-25
    相关资源
    最近更新 更多