如何按两列而不是一列对 table 进行排序
How to sort table by two columns instead of one
我有一个 table,我按建筑物名称对 ASC 进行排序。下一列是建筑物的相应建筑物编号。我有一个函数可以根据建筑物名称按 ASC 顺序对 table 进行排序。我希望能够同时按建筑物名称和建筑物编号进行排序。这是页面加载时 table 的片段。第一个 <td>
即建筑物名称按顺序排列。但是,下一个<td>
,也就是楼号,顺序不对。
<tbody class="meterList">
<tr>
<td>ACB</td>
<td>A2095</td>
</tr>
<tr>
<td>ACB</td>
<td>E1559</td>
</tr>
<tr>
<td>ACB</td>
<td>E1540</td>
</tr>
<tr>
<td>ADH</td>
<td>A0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1076</td>
</tr>
<tr>
<td>ADH</td>
<td>S0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1075</td>
</tr>
</tbody>
这是我使用的函数,按建筑物名称按 ASC 顺序对 table 进行排序。
$('.meterList').find('tr').sort(function(a, b) {
return $('td:first', a).text().localeCompare($('td:first', b).text());
}).appendTo($('.meterList'))
我尝试做类似的事情来按第一个和第二个排序 <td>
但这没有用。
$('.meterList').find('tr').sort(function(a, b) {
return $('td:first, td:second', a).text().localeCompare($('td:first, td:second', b).text());
}).appendTo($('.meterList'))
如果有人知道我如何按两列排序任何建议,将不胜感激!
应该这样做:
const t=(tr,i)=>tr.cells[i].textContent;
$(".meterList tr").get()
.sort((a,b)=>t(a,0).localeCompare(t(b,0)) || t(a,1).localeCompare(t(b,1)))
.map(tr=>$(".meterList").append(tr));
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<table><tbody class="meterList">
<tr>
<td>ACB</td>
<td>A2095</td>
</tr>
<tr>
<td>ACB</td>
<td>E1559</td>
</tr>
<tr>
<td>ACB</td>
<td>E1540</td>
</tr>
<tr>
<td>ADH</td>
<td>A0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1076</td>
</tr>
<tr>
<td>ADH</td>
<td>S0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1075</td>
</tr>
</tbody></table>
首先,我创建了一个小辅助函数 t(tr,I)
,它为给定 <tr>
.
获取第 i
个单元格的 .textContent
然后我将所有 <tr>
收集到一个数组中(.get()
从 jQuery 对象中提取 DOM 元素的实际数组)和 .sort()
它。 sort-callback 函数将首先比较两个给定 <tr>
的第一个单元格(索引=0),并且 - 只有当比较 returns 0
时 - 才会进行第二次比较(查看每个 <tr>
中的第二个单元格)。
即使不在实际 jQuery 构造之外创建任何可见变量或常量,也可以做到这一点。事实上,上面的代码中 jQuery 所剩无几,没有它也可以轻松完成。 ;-)
我有一个 table,我按建筑物名称对 ASC 进行排序。下一列是建筑物的相应建筑物编号。我有一个函数可以根据建筑物名称按 ASC 顺序对 table 进行排序。我希望能够同时按建筑物名称和建筑物编号进行排序。这是页面加载时 table 的片段。第一个 <td>
即建筑物名称按顺序排列。但是,下一个<td>
,也就是楼号,顺序不对。
<tbody class="meterList">
<tr>
<td>ACB</td>
<td>A2095</td>
</tr>
<tr>
<td>ACB</td>
<td>E1559</td>
</tr>
<tr>
<td>ACB</td>
<td>E1540</td>
</tr>
<tr>
<td>ADH</td>
<td>A0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1076</td>
</tr>
<tr>
<td>ADH</td>
<td>S0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1075</td>
</tr>
</tbody>
这是我使用的函数,按建筑物名称按 ASC 顺序对 table 进行排序。
$('.meterList').find('tr').sort(function(a, b) {
return $('td:first', a).text().localeCompare($('td:first', b).text());
}).appendTo($('.meterList'))
我尝试做类似的事情来按第一个和第二个排序 <td>
但这没有用。
$('.meterList').find('tr').sort(function(a, b) {
return $('td:first, td:second', a).text().localeCompare($('td:first, td:second', b).text());
}).appendTo($('.meterList'))
如果有人知道我如何按两列排序任何建议,将不胜感激!
应该这样做:
const t=(tr,i)=>tr.cells[i].textContent;
$(".meterList tr").get()
.sort((a,b)=>t(a,0).localeCompare(t(b,0)) || t(a,1).localeCompare(t(b,1)))
.map(tr=>$(".meterList").append(tr));
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<table><tbody class="meterList">
<tr>
<td>ACB</td>
<td>A2095</td>
</tr>
<tr>
<td>ACB</td>
<td>E1559</td>
</tr>
<tr>
<td>ACB</td>
<td>E1540</td>
</tr>
<tr>
<td>ADH</td>
<td>A0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1076</td>
</tr>
<tr>
<td>ADH</td>
<td>S0001</td>
</tr>
<tr>
<td>ADH</td>
<td>E1075</td>
</tr>
</tbody></table>
首先,我创建了一个小辅助函数 t(tr,I)
,它为给定 <tr>
.
i
个单元格的 .textContent
然后我将所有 <tr>
收集到一个数组中(.get()
从 jQuery 对象中提取 DOM 元素的实际数组)和 .sort()
它。 sort-callback 函数将首先比较两个给定 <tr>
的第一个单元格(索引=0),并且 - 只有当比较 returns 0
时 - 才会进行第二次比较(查看每个 <tr>
中的第二个单元格)。
即使不在实际 jQuery 构造之外创建任何可见变量或常量,也可以做到这一点。事实上,上面的代码中 jQuery 所剩无几,没有它也可以轻松完成。 ;-)