请求详解JavaScript中sort函数按用户出生日期排序的原理
详解基于出生日期排序用户数组的逻辑
前置内容说明
- users数组:存储了包含用户信息的对象,其中
DOB字段是DD-MM-YYYY格式的出生日期字符串 - getDateFromString函数:负责把
DD-MM-YYYY格式的字符串转为JavaScript的Date对象。原理是先拆分字符串得到日、月、年,再按YYYY/MM/DD的格式拼接后传给Date构造函数(这种格式对Date构造函数的兼容性更好)
核心:sort函数按出生日期排序的逻辑
JavaScript原生的Array.sort()默认按字符串Unicode码点排序,没法直接处理日期排序,所以必须传入自定义比较函数,这也是这段代码实现日期排序的关键。
比较函数的基础规则
sort()的比较函数会接收两个参数(这里是a和b,代表数组中正在对比的两个用户对象),返回值决定两者的排序位置:
- 返回负数:
a排在b的前面 - 返回正数:
b排在a的前面 - 返回0:两者位置保持不变
代码中的具体执行步骤
- 日期格式转换:调用
getDateFromString,把a和b的DOB字符串分别转为Date对象,存在d1和d2中 - 计算日期差值:当对
Date对象做减法运算时,JavaScript会自动将其转换为时间戳(即从1970年1月1日00:00:00 UTC到该日期的毫秒数),所以d1-d2的结果是两个日期的毫秒差值:- 如果
d1是更早的日期(比如示例中的1983年),它的时间戳更小,d1-d2得到负数,因此a(出生日期更早的用户)会排在b前面 - 如果
d1是更晚的日期,时间戳更大,d1-d2得到正数,b(出生日期更早的用户)会排在a前面 - 若两个日期相同,差值为0,两者位置不变
- 如果
最终排序结果
按照这段代码的逻辑,用户数组会按出生日期从早到晚排序,示例数组的最终顺序为:
- John smith(1983-07-21)
- Joyal white(1989-03-21)
- John wick(1990-01-22)
⚠️ 注意:sort()是原地排序方法,会直接修改原users数组,所以sorted_users其实是原数组的引用,两者指向同一个数组。
内容的提问来源于stack exchange,提问作者Abrham_m
相关产品推荐
相关产品推荐

