开发者问题收集

如何在 React 中的地图内部进行映射并将其放入表中?

2021-08-26
866

我现在已经努力尝试将数据放入表格中一段时间​​了。

我尝试了不同的方法,以最简单的方式从后端获取数据。 最新的尝试在 console.log(tableData) 中给出了这个:

(3) [{…}, {…}, {…}]
  0: period: "23"
     periodId: 1
     periodQuantity: Array(3)
       0: {period: "23", quantity: 1037, name: "Stolpar Tall"}
       1: {period: "23", quantity: 1077, name: "Stamblock Tall"}
       2: {period: "23", quantity: 590, name: "Grovtimmer Tall"}
       length: 3
       [[Prototype]]: Array(0)
     sortOrder: 0
     [[Prototype]]: Object
  1: {periodId: 2, period: "24", sortOrder: 0, periodQuantity: Array(3)}
  2: {periodId: 3, period: "25", sortOrder: 0, periodQuantity: Array(3)}
  length: 3
  [[Prototype]]: Array(0)

所以这是我在 React 中的代码,只是尝试做一个简单的表格来输出数据。 (之后我可以为其设置样式 ;)) 我试图在 .map 中执行 .map,但只收到错误:

TypeError: Cannot read property 'periodQuantity' of undefined
<div>
   <table>
      <thead>
        <tr>
          <th>Sortiment</th>
          {tableData.map(x => {
            return (
              <React.Fragment key={x.periodId}>
                <th key={x.periodId}>Week {x.period}</th>
              </React.Fragment>
            )
          })}
         </tr>
       </thead>
       <tbody>
         <tr>
           <th >Sort.Name </th>
           {tableData.map(({ periodQuantity }, i) => {
             {
              this.periodQuantity.map((p) => {
                return(
                   console.log(p),
                   <React.Fragment key={i}>
                      <td key={p.name}>P {p.name}.</td>
                   </React.Fragment>
                )
               })
              }
            })}
          </tr>
        </tbody>
      </table>
    </div>

如果我只是删除一些代码,那么只有第一个 .map 存在,并将 periodQuantity 放入 console.log(periodQuantity) 中,它会给我这个:

(3) [{…}, {…}, {…}]
  0: 
    name: "Sortiment name 1"
    period: "30"
    quantity: 55 
    [[Prototype]]: Object
  1: {period: "30", quantity: 32, name: "Sortiment name 2"}
  2: {period: "30", quantity: 64, name: "Sortiment name 2"}
  ...
  length: 3[[Prototype]]: Array(0)
(3) [{…}, {…}, {…}]
(3) [{…}, {…}, {…}]
and so on...

所以它实际上知道 periodQuantity 是什么,但是当我无法在第二个 .map 函数中做到这一点时,我做错了什么?

当所有数据都在表中时,我希望它看起来像这样:

Table with week行上的列标题和分类名称标题。每个分类名称和周之间的数量数据” src=

更新

tableData 来自 index.js 中的这个(与上面相同):

const [tableData, setTableData] = useState([{}]);

 followUpService.GetSortiment(periodDateTime).subscribe(
        (response) => handlePeriod(response),
        (error) => handleHttpRequestError(error.message));

  const handlePeriod = (response: any) => {
    setTableData(response);
  };

并且该服务进入后端并发回此: 结果发送回前端

更新 2 我回答了我自己的问题。请参阅下面的答案。希望它能在未来帮助到某人 :)

2个回答

删除此

this.periodQuantity.map((p) => {

保留原样

periodQuantity.map((p) => {

并从第一个地图返回

{tableData.map(({ periodQuantity }, i) => {
              return periodQuantity.map((p) => {
                return(
                   <React.Fragment key={p.name}>
                      <td>P {p.name}.</td>
                   </React.Fragment>
                )
               })
            })}

还更改了密钥,否则可能会重复,假定名称是唯一的,并从 td 中删除了密钥

这里是沙盒 https://codesandbox.io/s/weathered-platform-kftsv

iunfixit
2021-08-26

我最终发现,我需要在第二个 map 之前放置一个 if (periodQuantity != null) ,因为我认为它在有任何数据之前就被读取了。

这是我的最终解决方案,它可能会在未来帮助到某些人 :) 我还必须将 name 放在 periodQuantity 列表之外,并且只有 periodquantity 在该列表中。但我认为 map in map 问题的主要原因是第二个 .map 周围缺少 if (periodQuantity != null)

<div>
  <table>
     <thead>
        <tr>
          {tableData.slice(0,1).map(({ periodQuantity }) => {
            if (periodQuantity != null) {
              return( 
                <tr> 
                  <th>Sortiment</th>
                  {periodQuantity.map(({ period }) => {
                    return (
                      <React.Fragment >
                         <th key={period}>V.{period}</th>
                      </React.Fragment>
                   )})}
                </tr>
             )}})}
          </tr>
       </thead>
       <tbody>
         <tr>
            {tableData.map(({ periodQuantity, name }) => {
              if (periodQuantity != null) {
                return( 
                  <tr> 
                     <th key={name}>{name}</th>
                     {periodQuantity.map(({ period, quantity }) => {
                        return (
                           <React.Fragment >
                              <td key={period}>{quantity}</td>
                           </React.Fragment>
                      )})}
                   </tr>
               )}})}
           </tr>
         </tbody>
      </table>
   </div>
Maria
2021-08-31