localeCompare не определяет целое число при сортировке - PullRequest
0 голосов
/ 27 июня 2018

Я использую JS и jQuery для сортировки своей таблицы, и это мой код для сортировки таблицы

function sortTable(table, column, order) {
        var asc = order === 'asc';
        var tbody = table.find('tbody');

        tbody.find('tr').sort(function (a, b) {
            if (asc) {
                return $('td:eq(' + column + ')', a).text()
                    .localeCompare($('td:eq(' + column + ')', b).text());
            } else {
                return $('td:eq(' + column + ')', b).text()
                    .localeCompare($('td:eq(' + column + ')', a).text());
            }
        }).appendTo(tbody); 
    }

Проблема в том, что таблица отсортирована только по первому номеру, как это:

[ 1, 10, 12, 18, 2, 3, 33, 4, 5]

и я хочу, чтобы это было так

[ 1, 2 , 3, 4, 5, 10, 12, 18, 33]

Ответы [ 4 ]

0 голосов
/ 27 июня 2018
function sortTable(table, column, order) {
    var asc = order === 'asc';
    var tbody = table.find('tbody');

    tbody.find('tr').sort(function (a, b) {
        if (asc) {
             return parseInt($('td:eq(' + column + ')', a).text()) - parseInt($('td:eq(' + column + ')', b).text());
        } else {
            return parseInt($('td:eq(' + column + ')', b).text()) - parseInt($('td:eq(' + column + ')', a).text());
        }
    }).appendTo(tbody); 
}
0 голосов
/ 27 июня 2018

Поскольку он рассматривается как строковое, если вы хотите, чтобы число изменялось для этого столбца, предположим, что column равно 1, или, если у вас несколько числовых столбцов, вы можете проверить это в массиве, скажем, если есть для var check_col = [1,2,5];

 tbody.find('tr').sort(function (a, b) {
        if (asc) {
            if(column==1){ // if check_col.indexOf(column) > -1 for multiple numeric column
               return parseInt($('td:eq(' + column + ')', a).text()) - parseInt($('td:eq(' + column + ')', b).text());
            }else{
               return $('td:eq(' + column + ')', a).text()
                .localeCompare($('td:eq(' + column + ')', b).text());
            }
        } else {
            if(column==1){ // if check_col.indexOf(column) > -1 for multiple numeric column
               return parseInt($('td:eq(' + column + ')', b).text()) - parseInt($('td:eq(' + column + ')', a).text());
            }else{
               return $('td:eq(' + column + ')', b).text()
                .localeCompare($('td:eq(' + column + ')', a).text());
            }
        }
    }).appendTo(tbody); 
0 голосов
/ 27 июня 2018

Проблема в том, что вы сортируете числа в виде строк. Вы делаете это:

arr = [ 1, 5, 10, 12, 18, 2, 3, 33, 4];

arr.sort((a,b) => {
        return a.toString().localeCompare(b.toString());
      });
//[ 1, 10, 12, 18, 2, 3, 33, 4, 5 ]

и вы должны сделать что-то вроде:

arr.sort((a,b) => {
        return a>b;
      });
//[ 1, 2, 3, 4, 5, 10, 12, 18, 33 ]

Таким образом, вы можете привести $(whatever).text() к int, добавив + как +$(whatever).text() или используя parseInt()

если это числа $('td:eq(' + column + ')', a).text(), вы можете выполнить что-то вроде:

function sortTable(table, column, order) {
        var asc = order === 'asc';
        var tbody = table.find('tbody');

        tbody.find('tr').sort(function (a, b) {
            if (asc) {
                return parseInt($('td:eq(' + column + ')', a).text())>parseInt($('td:eq(' + column + ')', b).text());
            } else {
                return parseInt($('td:eq(' + column + ')', b).text())
                    <parseInt($('td:eq(' + column + ')', a).text());
            }
        }).appendTo(tbody); 
    }
0 голосов
/ 27 июня 2018

Попробуйте, я не даю прямого ответа, но это будет ваша проблема введите описание ссылки здесь

var stringArr = [10,"20",null,"1","bar","-2",-3,null,5,"foo"];


stringArr.sort(sortByDataString); 

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

// String sorting function
function sortByDataString(a, b) {
    if (a === null) {
        return 1;
    }
    if (b === null) {
        return -1;
    }
    if (isNumber(a) && isNumber(b)) {
        if (parseInt(a,10) === parseInt(b,10)) {
            return 0;
        }
        return parseInt(a,10) > parseInt(b,10) ? 1 : -1;
    }
    if (isNumber(a)) {
        return -1;
    }
    if (isNumber(b)) {
        return 1;
    }
    if (a === b) {
        return 0;
    }
    return a > b ? 1 : -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...