jqxGrid 中的字母数字排序
Alphanumeric Sort in jqxGrid
我正在使用 jQWidgets v3.7.1 并尝试使用唯一的字母数字命名约定对 jqxGrid 中的列进行排序,“Foo-1”、“Foo-2”等,我试图按最后一个排序字符串中的整数,但是因为字符串中既有字母数据也有数字数据,我们能得到的最接近的是这样的排序:
Foo-1
Foo-10
Foo-11
Foo-2
Foo-3
等等
我知道网格有自定义排序功能,但我不清楚如何以这种方式完成排序挑战。如果可能的话,我们真的不想将我们的数据结构更改为“Foo-01”、“Foo-02”之类的东西。感谢您提供的任何帮助。
更新:仅供参考,我尝试了 jqWidgets 提供的自定义排序示例的变体:
// prepare the data
var dataFields =
[
{ name: 'session_name', type: 'string' },
{ name: 'current_phase', type: 'string' },
{ name: 'current_stage', type: 'string' },
{ name: 'contractor_last_name', type: 'string' },
{ name: 'contractor_first_name', type: 'string' },
{ name: 'contractor_email', type: 'string' },
{ name: 'contractor_company_name', type: 'string' },
{ name: 'engagement_manager_last_name', type: 'string' },
{ name: 'engagement_manager_first_name', type: 'string' },
{ name: 'engagement_manager_email', type: 'string' },
{ name: 'department', type: 'string' },
{ name: 'start_time', type: 'date' },
{ name: 'outcome', type: 'string' },
{ name: 'outcome_report_file_name', type: 'string' },
{ name: 'end_time', type: 'date' },
{ name: 'jurisdictions', type: 'string' },
{ name: 'nls_session_id', type: 'string' },
{ name: 'next_steps_url', type: 'string' },
{ name: 'action_taken', type: 'string' },
];
var customsortfunc = function (column, direction) {
var sortdata = new Array();
if (direction == 'ascending') direction = true;
if (direction == 'descending') direction = false;
if (direction != null) {
for (i = 0; i < dataFields.length; i++) {
sortdata.push(dataFields[i]);
}
}
else sortdata = dataFields;
var tmpToString = Object.prototype.toString;
Object.prototype.toString = (typeof column == "function") ? column : function () { return this[column] };
if (direction != null) {
sortdata.sort(compare);
if (!direction) {
sortdata.reverse();
}
}
source.localdata = sortdata;
$("#evaluations-grid").jqxGrid('updatebounddata', 'sort');
Object.prototype.toString = tmpToString;
}
var compare = function (value1, value2) {
value1 = String(value1).toLowerCase();
value2 = String(value2).toLowerCase();
try {
var tmpvalue1 = parseFloat(value1.replace(/Foo\-/, ''));
if (isNaN(tmpvalue1)) {
if (value1 < value2) { return -1; }
if (value1 > value2) { return 1; }
}
else {
var tmpvalue2 = parseFloat(value2.replace(/Foo\-/, ''));
if (tmpvalue1 < tmpvalue2) { return -1; }
if (tmpvalue1 > tmpvalue2) { return 1; }
}
}
catch (error) {
var er = error;
}
return 0;
};
var source =
{
datatype: "json",
datafields: dataFields,
id: 'session_name',
url: url,
sort: customsortfunc,
sortcolumn: 'session_name',
sortdirection: 'asc'
};
但这不仅给我一个更不正确的结果系列,即:
Foo-2
Foo-3
Foo-4
Foo-5
Foo-1
Foo-6
Foo-7
等等
但是如果我尝试改变排序方向,我会从 11 个结果变成 19 个,只是数据完全消失了。
您可以通过替换 Foo-
部分(或所有非数字字符)来使用自定义比较功能,例如(取自 jqgrid 自定义排序示例):
var compare = function (value1, value2) {
value1 = String(value1).toLowerCase();
value2 = String(value2).toLowerCase();
try {
var tmpvalue1 = parseFloat(value1.replace(/Foo\-/, ''));
if (isNaN(tmpvalue1)) {
if (value1 < value2) { return -1; }
if (value1 > value2) { return 1; }
}
else {
var tmpvalue2 = parseFloat(value2.replace(/Foo\-/, ''));
if (tmpvalue1 < tmpvalue2) { return -1; }
if (tmpvalue1 > tmpvalue2) { return 1; }
}
}
catch (error) {
var er = error;
}
return 0;
};
我正在使用 jQWidgets v3.7.1 并尝试使用唯一的字母数字命名约定对 jqxGrid 中的列进行排序,“Foo-1”、“Foo-2”等,我试图按最后一个排序字符串中的整数,但是因为字符串中既有字母数据也有数字数据,我们能得到的最接近的是这样的排序:
Foo-1
Foo-10
Foo-11
Foo-2
Foo-3 等等
我知道网格有自定义排序功能,但我不清楚如何以这种方式完成排序挑战。如果可能的话,我们真的不想将我们的数据结构更改为“Foo-01”、“Foo-02”之类的东西。感谢您提供的任何帮助。
更新:仅供参考,我尝试了 jqWidgets 提供的自定义排序示例的变体:
// prepare the data
var dataFields =
[
{ name: 'session_name', type: 'string' },
{ name: 'current_phase', type: 'string' },
{ name: 'current_stage', type: 'string' },
{ name: 'contractor_last_name', type: 'string' },
{ name: 'contractor_first_name', type: 'string' },
{ name: 'contractor_email', type: 'string' },
{ name: 'contractor_company_name', type: 'string' },
{ name: 'engagement_manager_last_name', type: 'string' },
{ name: 'engagement_manager_first_name', type: 'string' },
{ name: 'engagement_manager_email', type: 'string' },
{ name: 'department', type: 'string' },
{ name: 'start_time', type: 'date' },
{ name: 'outcome', type: 'string' },
{ name: 'outcome_report_file_name', type: 'string' },
{ name: 'end_time', type: 'date' },
{ name: 'jurisdictions', type: 'string' },
{ name: 'nls_session_id', type: 'string' },
{ name: 'next_steps_url', type: 'string' },
{ name: 'action_taken', type: 'string' },
];
var customsortfunc = function (column, direction) {
var sortdata = new Array();
if (direction == 'ascending') direction = true;
if (direction == 'descending') direction = false;
if (direction != null) {
for (i = 0; i < dataFields.length; i++) {
sortdata.push(dataFields[i]);
}
}
else sortdata = dataFields;
var tmpToString = Object.prototype.toString;
Object.prototype.toString = (typeof column == "function") ? column : function () { return this[column] };
if (direction != null) {
sortdata.sort(compare);
if (!direction) {
sortdata.reverse();
}
}
source.localdata = sortdata;
$("#evaluations-grid").jqxGrid('updatebounddata', 'sort');
Object.prototype.toString = tmpToString;
}
var compare = function (value1, value2) {
value1 = String(value1).toLowerCase();
value2 = String(value2).toLowerCase();
try {
var tmpvalue1 = parseFloat(value1.replace(/Foo\-/, ''));
if (isNaN(tmpvalue1)) {
if (value1 < value2) { return -1; }
if (value1 > value2) { return 1; }
}
else {
var tmpvalue2 = parseFloat(value2.replace(/Foo\-/, ''));
if (tmpvalue1 < tmpvalue2) { return -1; }
if (tmpvalue1 > tmpvalue2) { return 1; }
}
}
catch (error) {
var er = error;
}
return 0;
};
var source =
{
datatype: "json",
datafields: dataFields,
id: 'session_name',
url: url,
sort: customsortfunc,
sortcolumn: 'session_name',
sortdirection: 'asc'
};
但这不仅给我一个更不正确的结果系列,即:
Foo-2
Foo-3
Foo-4
Foo-5
Foo-1
Foo-6
Foo-7 等等
但是如果我尝试改变排序方向,我会从 11 个结果变成 19 个,只是数据完全消失了。
您可以通过替换 Foo-
部分(或所有非数字字符)来使用自定义比较功能,例如(取自 jqgrid 自定义排序示例):
var compare = function (value1, value2) {
value1 = String(value1).toLowerCase();
value2 = String(value2).toLowerCase();
try {
var tmpvalue1 = parseFloat(value1.replace(/Foo\-/, ''));
if (isNaN(tmpvalue1)) {
if (value1 < value2) { return -1; }
if (value1 > value2) { return 1; }
}
else {
var tmpvalue2 = parseFloat(value2.replace(/Foo\-/, ''));
if (tmpvalue1 < tmpvalue2) { return -1; }
if (tmpvalue1 > tmpvalue2) { return 1; }
}
}
catch (error) {
var er = error;
}
return 0;
};