Tabulator 的 "time" 排序器无法按照 hh:mm:ss 格式正确排序
Tabulator's "time" sorter doesn't sort correctly with hh:mm:ss format
我已经 moment.js 加载和日期时间排序工作 - 这似乎需要格式化程序和排序程序 FWIW。但是对于 "time" 排序,我只是试图让数据以这种格式的字符串形式出现:
"hh:mm:ss"
然后,使用 "time" 分拣机,我这样配置它:
{'field': 'wall_time', 'title': 'wall_time', 'sorter': 'time', 'sorterParams': {'format': 'hh:mm:ss'}}
问题是,我的排序顺序不正确:
有什么办法可以进一步调试吗?
附录:请注意,我的列和行是在 Ajax 调用中创建 table 之后加载的 - 这可能会对排序行为产生影响:
table.setColumns(response.cols);
table.setData(response.rows);
因为您的时间不是有效时间,所以无法转换为标准的 24 小时时间。内置分拣机对您不起作用。你必须创造你自己的。您可以在此处阅读有关自定义排序器的更多信息,http://tabulator.info/docs/4.6/sort#func。
这是我相信对您有用的东西。 https://jsfiddle.net/nrayburn/6wygod1c/29/
一般的想法是更改您的列以使用您的自定义排序器。创建一个自定义排序器,returns 要比较的两个值之间的差异。
{
field: 'time',
name: 'Time',
sorter: customSorter
}
function customSorter(a, b){
const aArray = a.split(':');
const bArray = b.split(':');
let diff = 0;
for (let i = 0; i < 3; i++){
if (aArray[i] !== bArray[i]){
diff = bArray[i] - aArray[i];
break;
}
}
return diff;
}
因为这使用自定义排序器,所以您不需要再包含 moment.js。
我已经 moment.js 加载和日期时间排序工作 - 这似乎需要格式化程序和排序程序 FWIW。但是对于 "time" 排序,我只是试图让数据以这种格式的字符串形式出现:
"hh:mm:ss"
然后,使用 "time" 分拣机,我这样配置它:
{'field': 'wall_time', 'title': 'wall_time', 'sorter': 'time', 'sorterParams': {'format': 'hh:mm:ss'}}
问题是,我的排序顺序不正确:
有什么办法可以进一步调试吗?
附录:请注意,我的列和行是在 Ajax 调用中创建 table 之后加载的 - 这可能会对排序行为产生影响:
table.setColumns(response.cols);
table.setData(response.rows);
因为您的时间不是有效时间,所以无法转换为标准的 24 小时时间。内置分拣机对您不起作用。你必须创造你自己的。您可以在此处阅读有关自定义排序器的更多信息,http://tabulator.info/docs/4.6/sort#func。
这是我相信对您有用的东西。 https://jsfiddle.net/nrayburn/6wygod1c/29/
一般的想法是更改您的列以使用您的自定义排序器。创建一个自定义排序器,returns 要比较的两个值之间的差异。
{
field: 'time',
name: 'Time',
sorter: customSorter
}
function customSorter(a, b){
const aArray = a.split(':');
const bArray = b.split(':');
let diff = 0;
for (let i = 0; i < 3; i++){
if (aArray[i] !== bArray[i]){
diff = bArray[i] - aArray[i];
break;
}
}
return diff;
}
因为这使用自定义排序器,所以您不需要再包含 moment.js。