我正试图通过升序和降序在表中排列日期,我通过实现以下代码成功地实现了这一点;
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
等等
有什么建议吗?
在实现日期比较之前,您只需要检查两个字符串是否都是日期。如果它们都是日期,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");
从技术上讲,split()
函数不能失败。如果您尝试拆分没有可拆分字符的内容,可以尝试检查数组长度是否只有一。
类似这样的东西:
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);