吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 645|回复: 3
收起左侧

[求助] JS字符串日期排序问题

[复制链接]
cqwcns 发表于 2023-2-14 17:29
假设有一组日期,是字符串格式的,1位数的月和日没有补零。
现在需要进行排序,应该这么操作比较优雅。
难道要遍历补零再排序?这样做效率应该是比较差。


由于这个操作非常频繁,所以我要尽量考虑性能。
怎样写比较好?请各位大佬指教,感谢。

[JavaScript] 纯文本查看 复制代码
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']

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Nettos 发表于 2023-2-14 17:47
[JavaScript] 纯文本查看 复制代码
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);

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
Broadm + 1 + 1 我很赞同!
mzy666 + 1 + 1 我很赞同!

查看全部评分

侃遍天下无二人 发表于 2023-2-16 13:18
本帖最后由 侃遍天下无二人 于 2023-2-16 13:29 编辑

楼上的更优雅,但字符串转日期的运算肯定更比单纯的切割拼接更复杂(切割操作底层应该有优化的,因为字符串是常量),我这个方法也不是最好的,解析成整数也有开销,想进一步优化可以改为先比较字符串长度,长的更大,然后同长度的再直接比大小,不过代码就更长了,楼主自己补充上去
另外建议楼主不要用 减号 运算,尽量只用大小于和不等号,返回1,0,-1即可,减法中有隐式转为整数的过程

优雅和性能往往是不能兼得的

[JavaScript] 纯文本查看 复制代码
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[i]) 
        let b_i = parseInt(b_arr[i])
        if( a_i != b_i ) {
            return a_i - b_i
        }
    }
    return 0;
})

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 谢谢@Thanks!

查看全部评分

fortytwo 发表于 2023-2-17 11:26
本帖最后由 SailZhao520 于 2023-2-17 11:48 编辑

[JavaScript] 纯文本查看 复制代码
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"]

或者
[JavaScript] 纯文本查看 复制代码
// 原始的日期字符串数组
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[i]); // 将字符串转换为 Date 对象
  dates[i] = date; // 将对象存储到原数组中
  dateCache[i] = date.getTime(); // 将对象时间戳存储到缓存数组中
}

// 对原数组进行排序
dates.sort((a, b) => a.getTime() - b.getTime());

// 遍历原数组,将对象格式化为指定的字符串格式
for (let i = 0; i < len; i++) {
  // 使用简单的字符串截取操作完成日期格式化,避免使用 toLocaleDateString 方法的性能开销
  dates[i] = `${dates[i].getFullYear()}/${dates[i].getMonth() + 1}/${dates[i].getDate()}`;
}

// 打印排序后的结果
console.log(dates); // ["2022/12/2", "2022/12/3", "2023/1/6", "2023/2/8", "2023/10/9", "2023/11/16"]

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表