表未从对象数组中正确填充

Posted

技术标签:

【中文标题】表未从对象数组中正确填充【英文标题】:Table not populating properly from array of objects 【发布时间】:2021-07-27 23:00:17 【问题描述】:

我有一个对象数组。我想用对象数组中的值填充我的表:

这是我的代码:

let data = [
  cat: 'one', device: 'iphone',   site: 'google', val1:10, val2:20, val3:30,
  cat: 'two', device: 'iphone',  site: 'bing', val1:23, val2:12, val3:14,
  cat: 'three', device: 'iphone',  site: 'jeeves', val1:67, val2:78, val3:12,
  cat: 'four',  device: 'ipad',  site: 'google', val1:10, val2:20, val3:30,
  cat: 'five',  device: 'ipad',  site: 'bing', val1:23, val2:12, val3:14,
  cat: 'six',  device: 'ipad',  site: 'jeeves', val1:67, val2:78, val3:12,
  cat: 'seven',  device: 'mac',   site: 'google', val1:10, val2:20, val3:30,
  cat: 'eight',  device: 'mac',   site: 'bing', val1:23, val2:12, val3:14,
  cat: 'nine',  device: 'mac',   site: 'jeeves', val1:67, val2:78, val3:15  
]

let heads = Object.keys(data[0]);
heads.forEach(d => $(`#headers`).append(`<td>$d</td>`));

data.forEach(td => 
  $(`#body_deets`).append(`<tr></tr>`);
      heads.forEach(th => 
          $(`#body_deets > tr`).append(`<td>$td[th]</td>`);
        );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table class='table' border=1>
  <thead><tr id='headers'></tr></thead>
    <tbody id='body_deets'></tbody>
</table>

如您所见,当我尝试在表中追加数据时,所有数据都添加到一行,而不是一一追加。为什么我的表格没有正确填充?

【问题讨论】:

嗨,将 $(#body_deets &gt; tr) 更改为 $(#body_deets &gt; tr:last) 看看会发生什么。 @Swati,工作!如果您将其添加为答案,我可以检查它。谢谢! 【参考方案1】:

您当前的代码显示了这种行为,因为您将所有 trs 定位在 tbody 内,因此它在所有 trs 内附加数据。因此,要完成这项工作,请使用 :last 这将引用最后一个 tr 附加到 tbody 。即:

$(`#body_deets > tr:last`).append(`<td>$td[th]</td>`)

【讨论】:

【参考方案2】:

您会发现,如果您保留对新行的引用,则可以更轻松地向其中添加单元格。

通过改变

$('#body_deets').append(`<tr></tr>`);

var row = $("<tr>").appendTo("#body_deets");

然后您可以直接使用新的row,而无需为每一列查找它。

let data = [
  cat: 'one', device: 'iphone',   site: 'google', val1:10, val2:20, val3:30,
  cat: 'two', device: 'iphone',  site: 'bing', val1:23, val2:12, val3:14,
  cat: 'three', device: 'iphone',  site: 'jeeves', val1:67, val2:78, val3:12,
  cat: 'four',  device: 'ipad',  site: 'google', val1:10, val2:20, val3:30,
  cat: 'five',  device: 'ipad',  site: 'bing', val1:23, val2:12, val3:14,
  cat: 'six',  device: 'ipad',  site: 'jeeves', val1:67, val2:78, val3:12,
  cat: 'seven',  device: 'mac',   site: 'google', val1:10, val2:20, val3:30,
  cat: 'eight',  device: 'mac',   site: 'bing', val1:23, val2:12, val3:14,
  cat: 'nine',  device: 'mac',   site: 'jeeves', val1:67, val2:78, val3:15  
]

let heads = Object.keys(data[0]);
heads.forEach(d => $('#headers').append(`<th>$d</th>`));

data.forEach(td => 
  var row = $("<tr>").appendTo('#body_deets');
  heads.forEach(th => 
    row.append(`<td>$td[th]</td>`);
  );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table class='table' border=1>
  <thead>
    <tr id='headers'></tr>
  </thead>
  <tbody id='body_deets'></tbody>
</table>

这使您的代码更容易遵循并且效率更高 - 更有效的是一次性将整行生成为字符串,然后附加它。

【讨论】:

以上是关于表未从对象数组中正确填充的主要内容,如果未能解决你的问题,请参考以下文章

用对象数组填充表

如何在异步调用期间填充数组并将其发送到响应对象中

MYSQL - 表未从过程更新

根据 DataReader 数据填充对象数组

在运行时更改用类对象填充的数组的大小 c++

如何基于二维数组填充 WPF 网格