将一个 table 行拆分为 5s 列的倍数

Split one table row into multiples of 5s column

假设我有一个包含 11 个元素的数组

var sizeArr = ['abc','bcd','cde','def','efg','fgh','ghi','hij'.'ijk','klm','lmn'];

我想根据上面的数组创建一个 HTML table,但想将该行分成 5 列。我有一些看起来与此类似的代码:

var cntr = 1;
for (....) {
    if (cntr == 1 || cntr % 6 == 0) {
        html += "<tr>";
    }

     html +="<td>.....</td>";

    if (cntr == sizeArr.length|| cntr % 5 == 0) {
        html += "</tr>";
    }
}

此代码适用于前 10 个元素。输出将类似于他的:

<tr>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>10 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>12</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>10.5 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>6</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>11 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>6</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>11.5 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>12</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>12 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>4</p>
   </td>
</tr>
<tr>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>13 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>4</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>14 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>6</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>8 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>8</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>8.5 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>8</p>
   </td>
   <td>
      <p class='COLUMN-DATA-PADDING-TXT'>9 D(M) US</p>
      <p class='COLUMN-DATA-PADDING-TXT'>6</p>
   </td>
</tr>
<td>
   <p class='COLUMN-DATA-PADDING-TXT'>9.5 D(M) US</p>
   <p class='COLUMN-DATA-PADDING-TXT'>6</p>
</td>

注意最后一个 td 上没有封闭的 tr。

您没有显示您在 for 循环中使用的条件,因此无法确定 您的 代码出了什么问题。我猜想第二个 if 条件正在测试 cntr == sizeArr.length 不是一个好兆头,因为如果循环计数器等于数组的 .length 那意味着 "current" sizeArr[cntr] 处的元素是 undefined - 数组中的最后一个元素位于 length-1.

位置

无论如何,就实现您的要求而言,我的建议是通过添加第一个 <tr> 和最后一个 </tr> 标签 outside 循环,因为这样你只需要一个 if 语句:

var sizeArr = ['abc','bcd','cde','def','efg','fgh','ghi','hij','ijk','klm','lmn'];

var html = "";
var cols = 5;
for (var i = 0; i < sizeArr.length; i++) {
  if (i % cols === 0 && i > 0) {
    html += "</tr><tr>";
  }
  html += "<td>" + sizeArr[i] + "</td>";
}
html = "<tr>" + html + "</tr>";
// do something with the html, e.g., for demo purposes:
console.log(html);
document.body.innerHTML = "<table>" + html + "</table>";

我可能会用 Array.prototype.reduce() 来完成这项工作。您可能选择不使用箭头功能,但想法就在这里。不过,您可以在控制台上查看结果以查看标签。

var sizeArr = ['abc','bcd','cde','def','efg','fgh','ghi','hij','ijk','klm','lmn'],
    myTable = sizeArr.reduce((p,c,i,a) => { i%5 === 0 && (p+="<tr>");
                                            i%5 === 4 || i === a.length-1 ? p+= "<td>" + c + "</td></tr>"
                                                                          : p+= "<td>" + c + "</td>"
                                            return p},"");
    
document.write("<table>"+myTable+"</table>");
console.log(myTable);