Нужна более умная функция сортировки таблиц jQuery - PullRequest
0 голосов
/ 15 мая 2018

Я использую следующий код из другого вопроса stackoverflow:

$('th').click(function(){
    var table = $(this).parents('table').eq(0)
    var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
    this.asc = !this.asc
    if (!this.asc){rows = rows.reverse()}
    for (var i = 0; i < rows.length; i++){table.append(rows[i])}
})
function comparer(index) {
    return function(a, b) {
        var valA = getCellValue(a, index), valB = getCellValue(b, index)
        return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB)
    }
}
function getCellValue(row, index){ return $(row).children('td').eq(index).text() }
table, th, td {
    border: 1px solid black;
}
th {
    cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
    <tr><th>Country</th><th>Pick</th><th>Size</th></tr>
    <tr><td>France</td><td>2</td><td>25</td></tr>
    <tr><td><a href=#>spain</a></td><td>-</td><td></td></tr>
    <tr><td>Lebanon</td><td>1</td><td>-17</td></tr>
    <tr><td>Argentina</td><td>DH</td><td>100</td></tr>
    <tr><td>USA</td><td>-</td><td>-6</td></tr>
</table>

, который отлично подходит для большинства данных.Моя проблема с колонкой "Pick".Я бы хотел, чтобы он сортировался так, чтобы он выглядел так:

Pick
1
2
DH
-
-

Я предполагаю, что это функция сравнения, которую мне нужно изменить.Как я могу изменить это так, чтобы он в основном всегда помещал «-» внизу таблицы, а затем сортировал числа от самого низкого до самого высокого с «DH» прямо под числами?Это довольно простое дополнение к функции?Или это тонна пользовательского кода?

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете просто добавить свою собственную логику в свой компаратор.

Единственная часть, которую я изменил в приведенном ниже фрагменте, - это содержимое function comparer(index).

$('th').click(function(){
    var table = $(this).parents('table').eq(0)
    var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()))
    this.asc = !this.asc
    if (!this.asc){rows = rows.reverse()}
    for (var i = 0; i < rows.length; i++){table.append(rows[i])}
})
function comparer(index) {
    return function(a, b) {
        var valA = getCellValue(a, index), valB = getCellValue(b, index);
        
        if (valA === "-") valA = Number.MAX_SAFE_INTEGER;
        if (valB === "-") valB = Number.MAX_SAFE_INTEGER;
        if (valA === "DH") valA = Number.MAX_SAFE_INTEGER - 1;
        if (valB === "DH") valB = Number.MAX_SAFE_INTEGER - 1;

        return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB)
    }
}
function getCellValue(row, index){ return $(row).children('td').eq(index).text() }
table, th, td {
    border: 1px solid black;
}
th {
    cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
    <tr><th>Country</th><th>Pick</th><th>Size</th></tr>
    <tr><td>France</td><td>2</td><td>25</td></tr>
    <tr><td><a href=#>spain</a></td><td>-</td><td></td></tr>
    <tr><td>Lebanon</td><td>1</td><td>-17</td></tr>
    <tr><td>Argentina</td><td>DH</td><td>100</td></tr>
    <tr><td>USA</td><td>-</td><td>-6</td></tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...