localeCompare排序时不检测整数

时间:2018-06-27 10:49:36

标签: javascript jquery laravel

我正在使用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]

5 个答案:

答案 0 :(得分:2)

有一个可以提供给localeCompare方法的选项对象。假定其选项之一表明您也可以比较数字(“ 1” <“ 2” <“ 10”)。 基本用法如下:

a.localeCompare(b, 'en', {numeric: true})

您的代码可以通过这种方式修改

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(), 'en', {numeric: true});
            } else {
                return $('td:eq(' + column + ')', b).text()
                    .localeCompare($('td:eq(' + column + ')', a).text(), 'en', {numeric: true});
            }
        }).appendTo(tbody); 
    }

检查链接以查找localeCompare方法的可能选项:

Intl.Collator() constructor

String.prototype.localeCompare()

答案 1 :(得分:0)

尝试一下,我没有给出直接的答案,但是这将是您的问题 enter link description here

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;
}

答案 2 :(得分:0)

因为如果您要将该列视为数字更改,则将其视为字符串,假设column1,或者如果您有多个数字列,则可以在数组中对其进行检查,可以说如果是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); 

答案 3 :(得分:0)

问题在于您正在按字符串对数字进行排序。您正在这样做:

Configure

,您应该执行以下操作:

if TPlatformServices.Current.SupportsPlatformService(
  IFMXScreenService, IInterface(clientScreenService)) then
    clientScreenScale := clientScreenService.GetScreenScale else
    clientScreenScale := 1;

MyImage.Bitmap.SetSize(
  MainForm.ClientWidth*clientScreenScale,
  MainForm.ClientHeight*clientScreenScale);

因此您可以将PosX := Trunc((MyImage.Bitmap.Width-spriteSize)/2); PosY := Trunc((MyImage.Bitmap.Height-spriteSize)/2); MyImage.Bitmap.Canvas.DrawBitmap( SpriteBitmap, RectF(0,0,spriteSize,spriteSize), RectF(PosX,PosY,PosX+spriteSize,PosY+spriteSize), 1,True); 强制转换为像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(),则可以执行以下操作:

+$(whatever).text()

答案 4 :(得分:0)

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); 
}
相关问题