我正在尝试通过升序和降序在表格中排序日期,我已经通过实现以下代码设法使日期生效;
fp.onCommand.subscribe(function (e, args) {
context._dataView.sort(function (a, b) {
var c1 = a[args.column.field].split('/');
var c2 = b[args.column.field].split('/');
return c1[2] - c2[2] || c1[1] - c2[1] || c1[0] - c2[0];
}, args.command === "sort-asc");
});
但是,现在这将不会对其余的列(包括名称,数字,小数)进行排序。当我对没有日期的任何列进行排序时,它在我的split
处失败。这是我最初对每一列进行完美排序而不对日期进行排序的代码;
fp.onCommand.subscribe(function (e, args) {
context._dataView.sort(function (a, b) {
var c1 = a[args.column.field];
var c2 = b[args.column.field];
if (c1 > c2) {
c1 = c1.toString().toLowerCase();
return 1;
}
if (c2 > c1) {
c2 = c2.toString().toLowerCase();
return -1;
}
}, args.command === "sort-asc");
});
我需要以某种方式获取日期排序,同时允许我对许多其他列进行排序。如果可能的话,我需要编写类似拆分无效的代码,然后执行代码的第二部分。
如果可能,我需要保留所有内容,因此我需要具有格式化日期的确切代码,但是我还需要toString
toLowerCase
和我的c1 > c2
,依此类推。
有什么建议吗?
答案 0 :(得分:1)
从技术上讲,split()
函数不会失败。如果您尝试拆分不具有可拆分字符的内容,则可以尝试检查数组长度是否仅为1。
类似这样的东西:
var a = "Hello";
var b = "Hello World";
function splitter(s) {
var ar = s.split(" ");
if (typeof ar == "object")
if (ar.length > 1)
console.log("Split Succeeded");
else
console.log("Split Failed");
else
console.log("Something wrong happened!");
}
splitter(a);
splitter(b);
答案 1 :(得分:1)
您只需要在执行日期比较之前检查两个字符串是否都是日期。如果它们都是日期,请split
并返回您已经在执行的操作;否则,如果都不是日期,请使用原始算法。如果一个是日期,而另一个不是日期,则返回1或-1,具体取决于您希望日期位于顶部还是底部:
const isDate = item => typeof item === 'string' && item.includes('/');
context._dataView.sort(function (a, b) {
const c1 = a[args.column.field];
const c2 = b[args.column.field];
const aIsDate = isDate(c1)
const bIsDate = isDate(c2);
if (aIsDate && bIsDate) {
const c1d = c1.split('/');
const c2d = c2.split('/');
return c1d[2] - c2d[2] || c1d[1] - c2d[1] || c1d[0] - c2d[0];
} else if (!aIsDate && !bIsDate) {
// Neither are dates:
return c1 > c2 ? 1 : -1;
} else if (aIsDate && !bIsDate) {
return 1;
} else {
// bIsDate and !aIsDate
return -1
}
}, args.command === "sort-asc");