JS / HTML如何使用固定的子行对表进行排序 [英] JS/HTML how to sort table with fixed subrows

查看:116
本文介绍了JS / HTML如何使用固定的子行对表进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下表格设置:

table {border-collapse:collapse;} table,th,td {border:1px solid black;}

 <表> < THEAD> < TR> < th>系统名称< / th> <的第i; TotalSystemGB< /第> <的第i;驱动和LT; /第>总GB /秒< th>使用的GB< / th> < th>免费GB< / th> < / TR> < / THEAD> < TBODY> < tr class =mainRow> < td>系统1< / td> < TD> 1100< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统1< / td> < TD>< / TD> < TD> C:< / TD> < TD> 100℃; / TD> < TD> 50℃; / TD> < TD> 50℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统1< / td> < TD>< / TD> < TD> d:其中; / TD> < TD> 1000℃; / TD> < TD> 750℃; / TD> < TD> 250℃; / TD> < / TR> < tr class =mainRow> < td>系统2< / td> < TD> 820< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统2< / td> < TD>< / TD> < TD> C:< / TD> < TD> 120℃; / TD> < TD> 70℃; / TD> < TD> 50℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统2< / td> < TD>< / TD> < TD> d:其中; / TD> < TD> 700℃; / TD> < TD> 500℃; / TD> < TD> 200℃; / TD> < / TR> < tr class =mainRow> < td>系统3< / td> < TD> 3080< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统3< / td> < TD>< / TD> < TD> C:< / TD> < TD> 80℃; / TD> < TD> 30℃; / TD> < TD> 50℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统3< / td> < TD>< / TD> < TD> d:其中; / TD> < TD> 1000℃; / TD> < TD> 750℃; / TD> < TD> 250℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统3< / td> < TD>< / TD> < TD> E:< / TD> < TD> 2000< / TD> < TD> 1500< / TD> < TD> 500℃; / TD> < / TR> < / tbody< / table>  

我希望拥有以下行为:


  • 在系统名称和TotalSystemGB上进行排序时,只会根据mainRows对数据进行排序,但子行保持连接


  • $ b $在排序完整,已用或空闲的GB时,subRows只会在mainRows中排序。 b

    我目前使用排序,但我没有看到一种方法让它以我想要的方式工作,特别是在保持子行连接到mainRows方面。



    有没有一种巧妙的方法可以解决这个问题?

    解决方案

    要对主要行进行排序,您需要找到mainRows及其相应的子行, p>

    对于子行,您还需要查找mainRows,但只能在它们相应的mainRow之后追加它们。



    var last_column; function get_mains(){var mains = document.querySelectorAll(。mainRow); var mains_array = [] mains.forEach(item => mains_array.push(item)); return mains_array;} function order_mains(column){var mains_array = get_mains(); var table = document.getElementById(body); mains_array.sort(function(a,b){let a_text = a.querySelectorAll(td)[column] .innerText; let b_text = b.querySelectorAll(td)[column] .innerText; let truthy; if列){return + a_text< + b_text;} else {return a_text.localeCompare(b_text);}}); if(last_column === column){mains_array.reverse(); }(让项目的mains_array){var siblings = []; var sibling = item.nextElementSibling; table.appendChild(项目);做{if(sibling.className ===mainRow){break; } siblings.push(兄弟姐妹); } while(sibling = sibling.nextElementSibling); for(let sib of siblings){table.appendChild(sib); }} last_column =(last_column ===列)? -1:column;} function order_subs(column){var mains_array = get_mains(); var tbody = document.getElementById(body); for(let mains_array){var siblings = []; var sibling = item.nextElementSibling;做{if(sibling.className ===mainRow){break; } siblings.push(兄弟姐妹); } while(sibling = sibling.nextElementSibling); siblings.sort(function(a,b){let a_text = a.querySelectorAll(td)[column] .innerText; let b_text = b.querySelectorAll(td)[column] .innerText; return + a_text< + b_text;}); if(last_column === column){siblings.reverse(); } for(let sib of siblings){body.insertBefore(sib,item.nextElementSibling); }} last_column =(last_column ===列)? -1:column;}

    table {border-collapse:折叠;} table,th,td {border:1px solid black;}

     < table id =the_table> < THEAD> < TR> < th onclick =order_mains(0)>系统名称< / th> < th onclick =order_mains(1)> TotalSystemGB< / th> <的第i;驱动和LT; /第> < th onclick =order_subs(3)> Total GB< / th> < th onclick =order_subs(4)>使用GB< / th> < th onclick =order_subs(5)> Free GB< / th> < / TR> < / THEAD> < tbody id =body> < tr class =mainRow> < td>系统1< / td> < TD> 1100< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统1< / td> < TD>< / TD> < TD> C:< / TD> < TD> 100℃; / TD> < TD> 50℃; / TD> < TD> 50℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统1< / td> < TD>< / TD> < TD> d:其中; / TD> < TD> 1000℃; / TD> < TD> 750℃; / TD> < TD> 250℃; / TD> < / TR> < tr class =mainRow> < td>系统3< / td> < TD> 820< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统3< / td> < TD>< / TD> < TD> C:< / TD> < TD> 120℃; / TD> < TD> 70℃; / TD> < TD> 50℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统3< / td> < TD>< / TD> < TD> d:其中; / TD> < TD> 700℃; / TD> < TD> 500℃; / TD> < TD> 200℃; / TD> < / TR> < tr class =mainRow> < td>系统2< / td> < TD> 3080< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < TD>< / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统2< / td> < TD>< / TD> < TD> C:< / TD> < TD> 80℃; / TD> < TD> 30℃; / TD> < TD> 50℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统2< / td> < TD>< / TD> < TD> d:其中; / TD> < TD> 1000℃; / TD> < TD> 750℃; / TD> < TD> 250℃; / TD> < / TR> < tr class =subRow> < td>& nbsp;& nbsp;& nbsp;系统2< / td> < TD>< / TD> < TD> E:< / TD> < TD> 2000< / TD> < TD> 1500< / TD> < TD> 500℃; / TD> < / TR> < / tbody>< / table>  


    I have the following table setup:

    table {
        border-collapse: collapse;
    }
    
    table, th, td {
        border: 1px solid black;
    }

    <table>
      <thead>
        <tr>
          <th>System Name</th>
          <th>TotalSystemGB</th>
          <th>Drive</th>
          <th>Total GB</th>
          <th>Used GB</th>
          <th>Free GB</th>
        </tr>
      </thead>
      <tbody>
        <tr class="mainRow">
          <td>System 1</td>
          <td>1100</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 1</td>
          <td></td>
          <td>C:</td>
          <td>100</td>
          <td>50</td>
          <td>50</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 1</td>
          <td></td>
          <td>D:</td>
          <td>1000</td>
          <td>750</td>
          <td>250</td>
        </tr>
        <tr class="mainRow">
          <td>System 2</td>
          <td>820</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 2</td>
          <td></td>
          <td>C:</td>
          <td>120</td>
          <td>70</td>
          <td>50</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 2</td>
          <td></td>
          <td>D:</td>
          <td>700</td>
          <td>500</td>
          <td>200</td>
        </tr>
        <tr class="mainRow">
          <td>System 3</td>
          <td>3080</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 3</td>
          <td></td>
          <td>C:</td>
          <td>80</td>
          <td>30</td>
          <td>50</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 3</td>
          <td></td>
          <td>D:</td>
          <td>1000</td>
          <td>750</td>
          <td>250</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 3</td>
          <td></td>
          <td>E:</td>
          <td>2000</td>
          <td>1500</td>
          <td>500</td>
        </tr>
      </tbody
    </table>

    I would like to have the following behaviour:

    • When sorting on "System Name" and "TotalSystemGB" only the data gets sorted according to mainRows but the subRows remain attached correctly.
    • When sorting on total, used or free GB the subRows get sorted only within the mainRows.

    I currently use sortable but I don't see a way to make it work in the way I want it to, especially in regards of keeping the subRows attached to the mainRows.

    Is there a clever way to solve this?

    解决方案

    To sort the main rows, you will need to find the mainRows and their corresponding subRows then basically append them appropriate.

    For sub rows, you will also need to find the mainRows but then only append them AFTER their corresponding mainRow.

    var last_column;
    
    function get_mains()
    {
      var mains = document.querySelectorAll(".mainRow");
      var mains_array = []
      
      mains.forEach( item => mains_array.push(item) );
      return mains_array;
    }
    
    
    
    function order_mains(column)
    {
    	var mains_array = get_mains();
     	var table = document.getElementById("body");
      
     	mains_array.sort( function (a, b) {
        let a_text = a.querySelectorAll("td")[column].innerText;
        let b_text = b.querySelectorAll("td")[column].innerText;
        let truthy;
        if (column)
        {
        	return +a_text < +b_text;
        }
        else
        {
        	return a_text.localeCompare(b_text);
        }
      });  
      
      if (last_column === column)
      {
      	mains_array.reverse();
      }
    
      for (let item of mains_array)
      {
        var siblings = [];
        var sibling = item.nextElementSibling;
        
        table.appendChild(item);
        
        do
        {
          if (sibling.className === "mainRow")
          {
            break;
          }
          siblings.push(sibling);
        }
        while ( sibling = sibling.nextElementSibling);
        
        for (let sib of siblings)
        {
          table.appendChild(sib);
        }
      }
      last_column = (last_column === column) ? -1 : column;
    }
    
    
    
    function order_subs(column)
    {
    	var mains_array = get_mains();
      var tbody = document.getElementById("body");
      for (let item of mains_array)
      {
        var siblings = [];
        var sibling = item.nextElementSibling;
    
        do
        {
          if (sibling.className === "mainRow")
          {
            break;
          }
          siblings.push(sibling);
        }
        while ( sibling = sibling.nextElementSibling);
        
    	 	siblings.sort( function (a, b) {
        let a_text = a.querySelectorAll("td")[column].innerText;
        let b_text = b.querySelectorAll("td")[column].innerText;
        return +a_text < +b_text;
     		});     
        
        if (last_column === column)
        {
          siblings.reverse();
        }   
        
        for (let sib of siblings)
        {
          body.insertBefore(sib, item.nextElementSibling);
        }
      }
      last_column = (last_column === column) ? -1 : column;
    }

    table {
        border-collapse: collapse;
    }
    
    table, th, td {
        border: 1px solid black;
    }

    <table id="the_table">
      <thead>
        <tr>
          <th onclick="order_mains(0)">System Name</th>
          <th onclick="order_mains(1)">TotalSystemGB</th>
          <th>Drive</th>
          <th onclick="order_subs(3)">Total GB</th>
          <th onclick="order_subs(4)">Used GB</th>
          <th onclick="order_subs(5)">Free GB</th>
        </tr>
      </thead>
      <tbody id="body">
        <tr class="mainRow">
          <td>System 1</td>
          <td>1100</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 1</td>
          <td></td>
          <td>C:</td>
          <td>100</td>
          <td>50</td>
          <td>50</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 1</td>
          <td></td>
          <td>D:</td>
          <td>1000</td>
          <td>750</td>
          <td>250</td>
        </tr>
        <tr class="mainRow">
          <td>System 3</td>
          <td>820</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 3</td>
          <td></td>
          <td>C:</td>
          <td>120</td>
          <td>70</td>
          <td>50</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 3</td>
          <td></td>
          <td>D:</td>
          <td>700</td>
          <td>500</td>
          <td>200</td>
        </tr>
        <tr class="mainRow">
          <td>System 2</td>
          <td>3080</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 2</td>
          <td></td>
          <td>C:</td>
          <td>80</td>
          <td>30</td>
          <td>50</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 2</td>
          <td></td>
          <td>D:</td>
          <td>1000</td>
          <td>750</td>
          <td>250</td>
        </tr>
        <tr class="subRow">
          <td>&nbsp;&nbsp;&nbsp;&nbsp;System 2</td>
          <td></td>
          <td>E:</td>
          <td>2000</td>
          <td>1500</td>
          <td>500</td>
        </tr>
      </tbody>
    </table>

    这篇关于JS / HTML如何使用固定的子行对表进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆