我正在使用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]
答案 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方法的可能选项:
答案 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)
因为如果您要将该列视为数字更改,则将其视为字符串,假设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);
答案 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);
}