如何按日期升序排序含Date对象的JavaScript类实例数组?
解决按Date属性升序排序数组的问题
首先,你当前使用的ultraarr.sort()是默认的字符串排序逻辑,完全不适用于Date对象的比较。要实现按dates属性升序排序,我们需要给sort()方法传入一个自定义的比较函数。
正确的排序实现
Date对象在参与减法运算时,会自动转换为对应的时间戳(从1970年1月1日至今的毫秒数),因此我们可以直接通过减法来比较两个Date对象的先后顺序:
// 按dates属性升序排序(越早的日期排在前面) ultraarr.sort((a, b) => a.dates - b.dates);
如果你想显式使用valueOf()方法(它返回的就是Date对象对应的时间戳),也可以写成:
ultraarr.sort((a, b) => a.dates.valueOf() - b.dates.valueOf());
优化代码逻辑
另外,注意到你把sort()放在了循环内部,这会导致每次循环都重新排序数组,非常低效。正确的做法是先完成数组排序,再进行循环渲染:
// 先排序数组 ultraarr.sort((a, b) => a.dates - b.dates); // 再循环渲染内容 for (let i = 0; i < ultraarr.length; i++) { $("row").append(ultraarr[i].display()); }
原理说明
当比较函数返回负数时,sort()会将a放在b的前面;返回正数时则相反;返回0则保持两者的相对位置。因为更早的Date对象对应的时间戳数值更小,所以a.dates - b.dates得到负数时,说明a的日期更早,会被排在前面,正好符合升序排序的需求。
内容的提问来源于stack exchange,提问作者Tomerson Jefferson
相关产品推荐
相关产品推荐

