【问题标题】:Highlight differences in row data of HTML table突出显示 HTML 表格的行数据差异
【发布时间】:2020-10-22 14:52:40
【问题描述】:

我有这个 HTML 表格,其中:

  • 第一行是表头
  • 第三行显示错误数据
  • 对于每个错误的行,我们都有 1 行显示正确的数据(第 2 行)。

我想用 HTML/Javascript/Jquery 编写一个函数来突出显示两行之间具有匹配数据的单元格。 我们可能有两行以上的数据。

所以基本上,我们必须测试一组两个行,即第一个标题行将被跳过。比较第 2 到第 3,然后测试第 4 到第 5,然后测试第 6 到第 7 等等。

在下面的示例中,John Popular 先生的第 11 列(列名:必填?)中的预期值为“N”,但 Excel 报告显示“Y”。

对于 Bill Smith 先生,即第 4 行和第 5 行的“未来到期日期”列和“服务日期”列中的日期不同。

我想强调这种差异。

  
<table border="1" class="dataframe data">
      <thead>
        <tr style="text-align: right;">
          <th>Test</th>
          <th>first name</th>
          <th>last name</th>
          <th>person id</th>
          <th>contract id</th>
          <th>plan id</th>
          <th>authnumber</th>
          <th>request?</th>
          <th>window type</th>
          <th>date request </th>
          <th>Required?</th>
          <th>Solved?</th>
          <th>More attaintion?</th>
          <th>Status</th>
          <th>Future Exp Date</th>
          <th>Issue resolved?</th>
          <th>date of service</th>
          <th>date of exp</th>
          <th>date of system</th>
          <th>Receipt date</th>
          <th>TAT1</th>
          <th>DaysTAT1</th>
          <th>TAT2</th>
          <th>DaysTAT2</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Correct data</td>
          <td>John</td>
          <td>Popular</td>
          <td>759876</td>
          <td>J4856</td>
          <td>642</td>
          <td>837522</td>
          <td>A</td>
          <td>FO</td>
          <td>2019-01-14</td>
          <td>N</td>
          <td>N</td>
          <td>NA</td>
          <td>Approved</td>
          <td>2019-01-14</td>
          <td>NA</td>
          <td>NA</td>
          <td>NA</td>
          <td>2019-01-14</td>
          <td>NA</td>
          <td>0.0</td>
          <td>Y</td>
          <td>NA</td>
          <td>N</td>
        </tr>
        <tr>
          <td>Wrong Data</td>
          <td>John</td>
          <td>Popular</td>
          <td>759876</td>
          <td>J4856</td>
          <td>642</td>
          <td>837522</td>
          <td>A</td>
          <td>FO</td>
          <td>2019-01-14</td>
          <td>Y</td>
          <td>N</td>
          <td>NA</td>
          <td>Approved</td>
          <td>2019-01-14</td>
          <td>NA</td>
          <td>NA</td>
          <td>NA</td>
          <td>2019-01-14</td>
          <td>NA</td>
          <td>0.0</td>
          <td>Y</td>
          <td>NA</td>
          <td>N</td>
        </tr>
        <tr>
          <td>Correct data</td>
          <td>Bill</td>
          <td>Smith</td>
          <td>64963</td>
          <td>J6291</td>
          <td>642</td>
          <td>837522</td>
          <td>A</td>
          <td>FO</td>
          <td>2019-01-14</td>
          <td>N</td>
          <td>N</td>
          <td>NA</td>
          <td>Approved</td>
          <td>2019-01-17</td>
          <td>NA</td>
          <td>NA</td>
          <td>NA</td>
          <td>2019-01-18</td>
          <td>NA</td>
          <td>0.0</td>
          <td>Y</td>
          <td>NA</td>
          <td>N</td>
        </tr>
        <tr>
          <td>Wrong Data</td>
          <td>Bill</td>
          <td>Smith</td>
          <td>64963</td>
          <td>J6291</td>
          <td>642</td>
          <td>837522</td>
          <td>A</td>
          <td>FO</td>
          <td>2019-01-17</td>
          <td>N</td>
          <td>N</td>
          <td>NA</td>
          <td>Approved</td>
          <td>2019-01-18</td>
          <td>NA</td>
          <td>NA</td>
          <td>NA</td>
          <td>2019-01-14</td>
          <td>NA</td>
          <td>0.0</td>
          <td>Y</td>
          <td>NA</td>
          <td>N</td>
        </tr>
      </tbody>
    </table>
    <br>
    <button>Check constraints</button>
    

【问题讨论】:

  • TBH,这个问题有点混乱:我有两行 - 有 4 行 第 11 列 - 有 3 列。 “代码不应突出显示,因为数据不匹配” - 但这完全是代码的用途(或者当它们相同时突出显示?)。如果您不想突出显示任何内容...不要致电checkConstraints()。您能否清理问题以明确结果应该是什么?
  • 感谢您的回复。我在 jsfiddle.net/fkmz8swq 创建了原始代码的副本。有两行和 1 个标题行。两行相同。唯一的区别在于第 11 列。
  • 这不是很棒的代码,但也不是一个好的 SO 问题,所以这里有一些 cmets:cell={} 应该是 cachedValues={},这样才更有意义。 .map() 创建一个数组只是为了便于使用/速度。然后它执行一个多维数组循环(经典 ij 变量)并检查 td 文本值是否在 cachedValues 中 - 如果不是,则将其添加到缓存并引用源单元格(td,看看为什么 cell 是一个坏名字?)。如果是,请使用 arguments 调用 highlight(),这有点不清楚,但会将不常见的数组调用转换为 $([cell1, cell2])
  • 然后有一个 second 检查将当前列值与 below 行中的同一列进行比较(这看起来有点奇怪,但与上一行相比没有真正的不同)
  • 代码使用.toggleClass,为了清楚起见,它应该只使用.addClass.removeClass

标签: javascript html jquery


【解决方案1】:

我有一个表格,它在第一行显示来自数据库的数据(正确的数据)。 第二行显示来自 excel 的错误数据(错误数据)。

我想让最终用户通过突出显示单元格来轻松查看数据库数据和 Excel 数据的差异

取原始代码和 2 行,删除 cells 部分,因为它沿着行而不是列向下检查。也可以删除循环行,因为只有两行,所以这是比较 row[0][col]row[1][col] 的情况

通过其他一些调整,例如删除令人困惑的.toggleClass(class, true),并对类名/按钮标题进行轻微调整,以便更清楚地了解它们的作用,给出:

function highlight(){    
    $(arguments).addClass('changed');
}
function checkConstraints(e){
    // reset style before re-checking
    $('td.changed').removeClass('changed');
    
    // get rows as an array of array
    var rows = $('tbody>tr').map(function(elem,i){
        return [$(this).children('td').toArray()];
    }).toArray();        
    
    // only 2 rows, so no need to loop them
    // start at j=1 to skip first column
    for(var j = 1; j < rows[0].length; j++){

      if (rows[0][j].innerText != rows[1][j].innerText) 
      {               
         highlight(rows[0][j],rows[1][j]);
      }            
    }        
}
$('button').click(checkConstraints);
td {
    width:100px;
    height:50px;
    border:1px solid black;
}
table {
    border:1px solid black;
    border-collapse:collapse;
}
td.changed {
    background:orange;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table border="1" class="dataframe data">
  <thead>
    <tr style="text-align: left;">
      <th>Test</th>
      <th>first name</th>
      <th>last name</th>
      <th>person id</th>
      <th>contract id</th>
      <th>plan id</th>
      <th>authnumber</th>
      <th>date request </th>
      <th>Required?</th>
      <th>Solved?</th>
      <th>More attaintion?</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Correct data</td>
      <td>John</td>
      <td>Popular</td>
      <td>759876</td>
      <td>J4856</td>
      <td>642</td>
      <td>837522</td>
      <td>2019-01-14</td>
      <td>N</td>
      <td>N</td>
      <td>NA</td>
      <td>Approved</td>
    </tr>
    <tr>
      <td>Wrong Data</td>
      <td>John</td>
      <td>Wick</td>
      <td>759876</td>
      <td>J4856</td>
      <td>-642</td>
      <td>837522</td>
      <td>2019-01-14</td>
      <td>Y</td>
      <td>N</td>
      <td>NA</td>
      <td>Approved</td>
    </tr>
  </tbody>
</table>
<br>
<button>Compare Rows</button>

【讨论】:

  • 谢谢!此代码有效!我将进行一些更改以使其可用于多行数据。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 2010-11-26
  • 2023-03-25
  • 2022-10-04
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多