【问题标题】:Sorting of numbers with special characters in different column values对不同列值中具有特殊字符的数字进行排序
【发布时间】:2018-02-14 09:27:14
【问题描述】:

我有一个 HTML 表格,有八列,其值由逗号、小数点等分隔。还有一些是百分比值和小时值。如何在第一次单击时按降序对值进行排序,在第二次单击时按升序对值进行排序单击相应的列标题时单击。

我尝试排序的代码如图:

function getVal(elm, n) {
      var v = $(elm).find('td').eq(n).text().toUpperCase();
      var num = v.split(/ /)[0].replace(/[^\d]/g, '')
      num = parseFloat(num);
      if ($.isNumeric(num)) {
        v = parseInt(num, 10);
      }
      return v;
    }

    var f = 1;
    $(".table-sortable .column-head").find('span').click(function(event) {
      event.preventDefault();
      table = $(this).closest('table');
      th = $(this).parent();
      $(th).find('span').toggleClass('rotate');

      f *= -1;
      var n = th.prevAll().length;
      console.log(n);
      var rows = table.find('tbody  tr').get();
      rows.sort(function(a, b) {
        var A = getVal(a, n);
        var B = getVal(b, n);
        if (A < B) {
          return -1 * f;
        }
        if (A > B) {
          return 1 * f;
        }
        return 0;
      });
      $.each(rows, function(index, row) {
        table.children('tbody').append(row);
      });
    });

HTML 表格:

<table class="table-sortable" id="myTable">
   <thead>
      <tr>
         <th scope="col" class="column-head"><span>abc1</span></th>
         <th scope="col" class="column-head"><span>abc2</span></th>
         <th scope="col" class="column-head"><span>abc3</span></th>
         <th scope="col" class="column-head"><span>abc4</span></th>
         <th scope="col" class="column-head"><span>abc5</span></th>
         <th scope="col" class="column-head"><span>abc6</span></th>
         <th scope="col" class="column-head"><span>abc7</span></th>
         <th scope="col" class="column-head"><span>abc8</span></th>
      </tr>
   </thead>
   <tbody class="table-body">
      <tr class="table-row">
         <td scope="row" class="column-fixed">BU001</td>
         <td class="column-values">18.240.00h</td>
         <td class="column-values">200h</td>
         <td class="column-values">46,13%</td>
         <td class="column-values">12.600.00€</td>
         <td class="column-values">77,00%</td>
         <td class="column-values">43.10%</td>
         <td class="column-values-end">2.82%</td>
      </tr>
      <tr class="table-row">
        <td scope="row" class="column-fixed">AU003</td>
        <td class="column-values">21.240.00h</td>
        <td class="column-values">120h</td>
        <td class="column-values">1,13%</td>
        <td class="column-values">4.600.00€</td>
        <td class="column-values">12,00%</td>
        <td class="column-values">66.10%</td>
        <td class="column-values-end">1.82%</td>
      </tr>
     <tr class="table-row">
         <td class="column-fixed">AU309</td>
         <td class="column-values">2.240.00h</td>
         <td class="column-values">200h</td>
         <td class="column-values">26,13%</td>
         <td class="column-values">59.600.00€</td>
         <td class="column-values">3,00%</td>
         <td class="column-values">40.10%</td>
         <td class="column-values-end">12.82%</td>
      </tr>
      <tr class="table-row">
         <td class="column-fixed">DT907</td>
         <td class="column-values">12.240.00h</td>
         <td class="column-values">100h</td>
         <td class="column-values">6,13%</td>
         <td class="column-values">49.600.00€</td>
         <td class="column-values">90,00%</td>
         <td class="column-values">4.10%</td>
         <td class="column-values-end">2.82%</td>
      </tr>
   </tbody>
</table>

【问题讨论】:

  • 你有一个很棒的 jquery 插件:datatables
  • 以任何方式编辑我尝试排序的代码。这样我就可以轻松排序
  • 有什么方法可以得到帮助?
  • 有什么问题?当我在 sn-p 中测试时,您的代码似乎可以工作
  • 请立即运行代码 sn-p。单击标题时,它没有得到排序

标签: javascript html jquery-plugins


【解决方案1】:

别忘了 jquery !

function getVal(elm, n) {
      var v = $(elm).find('td').eq(n).text().toUpperCase();
      //var num=(n!==0)? v.split(/ /)[0].replace(/[^\d]/g, ''):v;
      var num = v.match(/^\d/)?v.split(/ /)[0].replace(/[^\d]/g, ''):v;
      
      num = parseFloat(num);
      if ($.isNumeric(num)) {
        v = parseInt(num, 10);
      }
      return v;
    }

    var f = 1;
    $(".table-sortable .column-head").find('span').click(function(event) {
      event.preventDefault();
      table = $(this).closest('table');
      th = $(this).parent();
      $(th).find('span').toggleClass('rotate');

      f *= -1;
      var n = th.prevAll().length;
      console.log(n);
      var rows = table.find('tbody  tr').get();
      rows.sort(function(a, b) {
        var A = getVal(a, n);
        var B = getVal(b, n);
        if (A < B) {
          return -1 * f;
        }
        if (A > B) {
          return 1 * f;
        }
        return 0;
      });
      $.each(rows, function(index, row) {
        table.children('tbody').append(row);
      });
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table class="table-sortable" id="myTable">
   <thead>
      <tr>
         <th scope="col" class="column-head"><span>abc1</span></th>
         <th scope="col" class="column-head"><span>abc2</span></th>
         <th scope="col" class="column-head"><span>abc3</span></th>
         <th scope="col" class="column-head"><span>abc4</span></th>
         <th scope="col" class="column-head"><span>abc5</span></th>
         <th scope="col" class="column-head"><span>abc6</span></th>
         <th scope="col" class="column-head"><span>abc7</span></th>
         <th scope="col" class="column-head"><span>abc8</span></th>
      </tr>
   </thead>
   <tbody class="table-body">
      <tr class="table-row">
         <td scope="row" class="column-fixed">AU201</td>
         <td class="column-values">18.240.00h</td>
         <td class="column-values">200h</td>
         <td class="column-values">46,13%</td>
         <td class="column-values">12.600.00€</td>
         <td class="column-values">77,00%</td>
         <td class="column-values">43.10%</td>
         <td class="column-values-end">2.82%</td>
      </tr>
      <tr class="table-row">
        <td scope="row" class="column-fixed">BU004</td>
        <td class="column-values">21.240.00h</td>
        <td class="column-values">120h</td>
        <td class="column-values">1,13%</td>
        <td class="column-values">4.600.00€</td>
        <td class="column-values">12,00%</td>
        <td class="column-values">66.10%</td>
        <td class="column-values-end">1.82%</td>
      </tr>
     <tr class="table-row">
         <td class="column-fixed">AZ455</td>
         <td class="column-values">2.240.00h</td>
         <td class="column-values">200h</td>
         <td class="column-values">26,13%</td>
         <td class="column-values">59.600.00€</td>
         <td class="column-values">3,00%</td>
         <td class="column-values">40.10%</td>
         <td class="column-values-end">12.82%</td>
      </tr>
      <tr class="table-row">
         <td class="column-fixed">FE45</td>
         <td class="column-values">12.240.00h</td>
         <td class="column-values">100h</td>
         <td class="column-values">6,13%</td>
         <td class="column-values">49.600.00€</td>
         <td class="column-values">90,00%</td>
         <td class="column-values">4.10%</td>
         <td class="column-values-end">2.82%</td>
      </tr>
   </tbody>
</table>

【讨论】:

  • 带有特殊字符的数字得到了很好的排序。现在我编辑了第一列的值。我想根据字母而不是根据右侧的数字对这些值进行排序值。现在它按数字排序了。
  • 有什么方法可以得到帮助?
  • 在您的函数 getVal 中,您将所有非数字都替换为空。因此,对于您的第一列,它会比较字符串末尾的数值。如果它只出现在第一列,您可以在 getVal 中修改代码:var num=(n!==0)?v.split(/ /)[0].replace(/[^\d]/g, ''):v;或者如果您在其他列上遇到这种情况,只需检查值是否以数字开头:var num = (v.match(/^\d/))? v.split(/ /)[0].replace(/[^\d]/g, ''):v;
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 2012-05-25
  • 2017-05-28
  • 1970-01-01
  • 2020-05-23
  • 2020-11-13
  • 2015-02-08
  • 2021-06-03
相关资源
最近更新 更多