【问题标题】:html table: adding a class to the highest value of each columnhtml表:为每列的最高值添加一个类
【发布时间】:2018-09-10 21:24:42
【问题描述】:

有没有办法找到每列的最大值(在 html 表中)并使用 js 或 jQuery 向其中添加一个类?

注意:该表是使用<thead><tbody> 构建的

表格如下所示:

  <table>
    <thead>
      <tr>
        <th class="age">age</th>
        <th class="success">success</th>
        <th class="weight">weight</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>20</td>
        <td>30%</td>
        <td>70.5kg</td>
      </tr>
      <tr>
        <td>30</td>
        <td>40%</td>
        <td>80.9kg</td>
      </tr>
      <tr>
        <td>13</td>
        <td>60%</td>
        <td>20.53kg</td>
      </tr>
      <tr>
        <td>44</td>
        <td>80.44%</td>
        <td>20kg</td>
      </tr>
    </tbody>
  </table>

Codepen

【问题讨论】:

  • 什么是值类型,int?如果您可以发布呈现的 HTML,那将有助于我们提供更好的答案。
  • 为什么不在 jsfiddle 上发布表格样本?

标签: javascript jquery html-table


【解决方案1】:

FIDDLE - http://jsfiddle.net/tariqulazam/esfj9/

JAVASCRIPT

var $table = $("#mytable");
$table.find("th").each(function(columnIndex)
{
    var oldValue=0, currentValue=0, $elementToMark;
    var $trs = $table.find("tr");
    $trs.each(function(index, element)
    {
        $(this).find("td:eq("+ columnIndex +")").each(function()
        {
            if(currentValue>oldValue)
               oldValue = currentValue;
            currentValue = parseFloat($(this).html());
            if(currentValue > oldValue)
            {
                $elementToMark = $(this);
            }
            if(index == $trs.length-1)
            {
              $elementToMark.addClass("highest"); 
            }
        });
    });
});​

CSS

.highest{
    color:Red;
}​

【讨论】:

  • 这仅在您从标记中删除非数字字符时才有效
  • @Kevin Boucher- 感谢您指出这一点。我已经更新了我的代码。同时,当您对任何答案投了反对票时,请考虑添加可以做的事情以使其 100% 发挥作用;
  • @Jan - 感谢您审阅代码并使其更简洁。
  • @Tariqulazam 我留下了一条评论,说明了否决的原因——我认为修复你的代码不是我的工作。 (取消投票)
  • @kevinboucher - 问题的修复非常简单。如果需要花费大量时间,我绝对不希望人们修复我的代码。但是,再次感谢您指出问题并删除反对票。
【解决方案2】:

​这是我制作的 JSFiddle:JSFiddle

这是函数,使用 jQuery

function MarkLargest() {
    var colCount = $('th').length;
    var rowCount = $('tbody tr').length;
    var largestVals = new Array();

    for (var c = 0; c < colCount; c++) {
        var values = new Array();
        for (var r = 0; r < rowCount; r++) {
            var value = $('tbody tr:eq(' + r + ') td:eq(' + c + ')').text();
            value = value.replace("%", "").replace("kg", "");
            values.push(value);
        }
        var largest = Math.max.apply(Math, values);
        largestVals.push(largest);

        $('tbody tr').each(function() {
            var text = $(this).find('td:eq(' + c + ')').text();
            text = text.replace("%", "").replace("kg", "");
            if (text == largest) {
                $(this).find('td:eq(' + c + ')').addClass("max");
            }
        });
    }

    return largestVals[column];
}

$(function() {
    MarkLargest();
})​

【讨论】:

    【解决方案3】:

    好的,我的第一个答案只返回了特定列的最高值。我认为这就是您正在寻找的(在 vanilla JavaScript 中):

    HTML

      <table id="mytable">
        <thead>
          <tr>
            <th class="age">age</th>
            <th class="sucess">sucess</th>
            <th class="weight">weight</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>20</td>
            <td>30%</td>
            <td>70.5kg</td>
          </tr>
          <tr>
            <td>30</td>
            <td>40%</td>
            <td>80.9kg</td>
          </tr>
          <tr>
            <td>13</td>
            <td>60%</td>
            <td>20.53kg</td>
          </tr>
          <tr>
            <td>44</td>
            <td>80.44%</td>
            <td>20kg</td>
          </tr>
        </tbody>
      </table>
    

    JavaScript

    function markColumnCeilings ( table ) {
    
        if ( table === null ) return;
    
        var thead = table.tHead,
            tbody = table.tBodies[0],
            rowCount = tbody.rows.length,
            colCount = thead.rows[0].cells.length,
            maxvalues = new Array( colCount ),
            maxCells = new Array( colCount ),
            i = rowCount - 1,
            j = colCount - 1,
            cell, value;
    
        // Loops through rows/columns to get col ceilings
        for ( ; i > -1 ; i-- ) {
    
            for ( ; j > -1 ; j-- ) {
    
                cell = tbody.rows[ i ].cells[ j ];
                value = parseFloat( cell.innerHTML );
    
                if ( value.toString() === "NaN" ) continue;
    
                if ( value > ( maxvalues[ j ] === undefined ? -1 : maxvalues[ j ] ) ) {
                    maxvalues[ j ] =  value;
                    maxCells[ j ] = i + "," + j;
                }
    
            }
    
            j = colCount - 1;
    
        }
    
        // Set classes
        for ( ; j > -1 ; j-- ) {
            tbody.rows[ maxCells[ j ].split( "," )[ 0 ] ]
                 .cells[ maxCells[ j ].split( "," )[ 1 ] ]
                 .setAttribute( "class", "max" );
        }
    
    }
    
    var table = document.getElementById( 'mytable' );
    markColumnCeilings( table );
    

    CSS

    td.max { font-weight: bold; }
    

    小提琴:http://jsfiddle.net/kboucher/cH8Ya/

    【讨论】:

    • 如果数字不是 中的第一件事,您的答案将不会返回正确的值
    • 这永远是假的value === NaN
    • @user1689607 很好。已更新。
    • @KevinBoucher:我喜欢你的解决方案,但为什么不使用 maxCells[j] = [i, j]; 之类的东西而不是摆弄字符串呢?
    【解决方案4】:

    我已经修改了@sbonkosky 的功能,以便能够管理各种表格。就我而言,我有各种表格,并且混合了所有表格的值。

    function GetLargestValueForColumn(table) {
            let colCount = $('table:eq('+ table +') th').length;
            let rowCount = $('table:eq('+ table +') tbody tr').length;
            let largestVals = new Array();
    
            for (let c = 0; c < colCount; c++) {
                let values = new Array();
                for (let r = 0; r < rowCount; r++) {
                    let value = $('table:eq('+ table +') tbody tr:eq(' + r + ') td:eq(' + c + ')').text();
                    value = value.replace("%", "").replace("kg", "").replace(" ", "").replace(".", "");
                    values.push(value);
                }
                let largest = Math.max.apply(Math, values);
                largestVals.push(largest);
    
                $('tbody tr').each(function() {
                    let text = $(this).find('td:eq(' + c + ')').text();
                    text = text.replace("%", "").replace("kg", "").replace(" ", "").replace(".", "");
                    if (text == largest) {
                        $(this).find('td:eq(' + c + ')').addClass("max");
                    }
                });
            }
        return
    }
    $(function() {
        $('table').each(function(table) {GetLargestValueForColumn(table)});
    })
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签