JS字符串日期排序问题
假设有一组日期,是字符串格式的,1位数的月和日没有补零。现在需要进行排序,应该这么操作比较优雅。
难道要遍历补零再排序?这样做效率应该是比较差。
由于这个操作非常频繁,所以我要尽量考虑性能。
怎样写比较好?请各位大佬指教,感谢。
let arr = ['2022/12/3', '2023/2/8', '2023/10/9', '2023/11/16', '2022/12/2', '2023/1/6'];
console.log(arr.sort((a, b) => a - b));
// ['2022/12/3', '2023/2/8', '2023/10/9', '2023/11/16', '2022/12/2', '2023/1/6'] let arr = ['2022/12/3', '2023/2/8', '2023/10/9', '2023/11/16', '2022/12/2', '2023/1/6'];
arr.sort((a, b) => new Date(a) - new Date(b));
console.log(arr);
本帖最后由 侃遍天下无二人 于 2023-2-16 13:29 编辑
楼上的更优雅,但字符串转日期的运算肯定更比单纯的切割拼接更复杂(切割操作底层应该有优化的,因为字符串是常量),我这个方法也不是最好的,解析成整数也有开销,想进一步优化可以改为先比较字符串长度,长的更大,然后同长度的再直接比大小,不过代码就更长了,楼主自己补充上去
另外建议楼主不要用 减号 运算,尽量只用大小于和不等号,返回1,0,-1即可,减法中有隐式转为整数的过程
优雅和性能往往是不能兼得的
let arr = ['2022/12/3', '2023/2/8', '2023/10/9', '2023/11/16', '2022/12/2', '2023/1/6'];
arr.sort( (a, b) => {
let a_arr = a.split('/')
let b_arr = b.split('/')
for(let i=0;i<3;i++){
let a_i = parseInt(a_arr)
let b_i = parseInt(b_arr)
if( a_i != b_i ) {
return a_i - b_i
}
}
return 0;
}) 本帖最后由 SailZhao520 于 2023-2-17 11:48 编辑
const dates = ['2022/12/3', '2023/2/8', '2023/10/9', '2023/11/16', '2022/12/2', '2023/1/6'];
// 将日期字符串转换为 Date 对象并排序
const sortedDates = dates.map(date => new Date(date)).sort((a, b) => a - b).map(date => date.toLocaleDateString('zh-Hans-CN'));
console.log(sortedDates); // ["2022/12/2", "2022/12/3", "2023/1/6", "2023/2/8", "2023/10/9", "2023/11/16"]
或者
// 原始的日期字符串数组
const dates = ['2022/12/3', '2023/2/8', '2023/10/9', '2023/11/16', '2022/12/2', '2023/1/6'];
// 存储日期对象时间戳的缓存数组
const dateCache = [];
// 缓存数组长度
const len = dates.length;
// 遍历日期字符串数组,将字符串转换为 Date 对象,并将对象存储到原数组中,同时存储对象时间戳到缓存数组中
for (let i = 0; i < len; i++) {
const date = new Date(dates); // 将字符串转换为 Date 对象
dates = date; // 将对象存储到原数组中
dateCache = date.getTime(); // 将对象时间戳存储到缓存数组中
}
// 对原数组进行排序
dates.sort((a, b) => a.getTime() - b.getTime());
// 遍历原数组,将对象格式化为指定的字符串格式
for (let i = 0; i < len; i++) {
// 使用简单的字符串截取操作完成日期格式化,避免使用 toLocaleDateString 方法的性能开销
dates = `${dates.getFullYear()}/${dates.getMonth() + 1}/${dates.getDate()}`;
}
// 打印排序后的结果
console.log(dates); // ["2022/12/2", "2022/12/3", "2023/1/6", "2023/2/8", "2023/10/9", "2023/11/16"]
页:
[1]