迭代 zip iterable 以在 table 中生成多行 - Reactjs

iterate over zip iterable to produce multiple rows in table - Reactjs

我有一个数组数据库,我想将其解压并插入 table。

例如,我将有一个名为 a=[1,2,3,4]b=['a','b','c','d'] 的数组,每个数组的长度都相等。

我将有一个 table 只有 headers

a b

我生成的数组是 [[1,'a'],[2,'b'],[3,'c'],[4,'d']] 使用 underscore 包中的 zip 函数创建。

我的目标是迭代这个数组并生成以下内容

a b
1 'a'
2 'b'
3 'c'
4 'd'

此刻,我有一个

function returnIt(){
        let _ = require('underscore')
        //returns [[1,'a'],[2,'b'],[3,'c'],[4,'d']] so x[0] = 1 and x[1] = 'a'
        for (var x of _.zip([1,2,3,4],['a','b','c','d'])){
            return (
                <>
                    <td>
                        {x[0]}
                    </td>
                    <td>
                        {x[1]}
                    </td>
                </>
            )
        }
return(
    <table>
        <thead>
            <tr>
                <th>a</th>
                <th>b</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                {returnIt()}
            </tr>
        </tbody>
    </table>
)

但这不起作用。我得到


如你所见,我只得到一行,代码不会产生超过一行!抱歉 headers,我已经尽可能多地更改我的程序以适应您的眼睛。

无论如何,这是我的结果,我能改变什么?

假设这是使用 React

return (
                <>
                    <td>
                        {x[0]}
                    </td>
                    <td>
                        {x[1]}
                    </td>
                </>
            )

<td> 应该是 <tr>

的直系后代

问题是您 return 来自循环体。所以它只会到达第一个元素。

for (anything) {
   return ...
}

总是会立即return而不继续循环,无论括号之间是什么。

您需要让循环一次建立 HTML 和 return 所有行,或者可以使用生成器函数之类的东西并在 [= 的地方添加一个循环23=]调用函数。

假设您使用的框架只允许 return 不加引号 HTML,那么 return 值的 table 部分的问题可能是你不能在 <tr> 和其中一个包含的 <td> 之间有一个 <div>

returnIt 中,您的 for 循环 return 在代码块中,因此它只会 运行 一次,并且 return 您的第一对数组元素转换为 html 个元素。尝试 return 将压缩元素 映射 到标记片段。然后你就会看到它们。

这是一个完整的例子:

import _ from "underscore";

export default function App() {
 
  return(
  <table>
      <thead>
          <tr>
              <th>a</th>
              <th>b</th>
          </tr>
      </thead>
      <tbody>
          
              {returnIt()}

      </tbody>
  </table>)

}

function returnIt(){
  //returns [[1,'a'],[2,'b'],[3,'c'],[4,'d']] so x[0] = 1 and x[1] = 'a'
  let zipped = _.zip([1,2,3,4],['a','b','c','d'])
  return zipped.map(pair => {
      return (
          <tr>
              <td>
                  {pair[0]}
              </td>
              <td>
                  {pair[1]}
              </td>
          </tr>
      )
  })
}