按ISO日期排序对象数组时sort方法未生效的问题
问题原因及解决方法
你的问题出在Array.sort()的比较函数返回值不符合要求——sort的比较函数必须返回数字(负数、0、正数),而不是布尔值。
当你写(c,d) => c.fecha > d.fecha时,这个函数只会返回true或false,这两个值会被自动转换成1或0。但sort的逻辑是:
- 返回负数:c排在d前面
- 返回正数:d排在c前面
- 返回0:两者位置不变
你的比较函数永远不会返回负数,所以无法正确触发元素的位置交换,导致数组看起来没变化。
正确的排序写法
因为你的日期是YYYY-MM-DD格式,字符串的字典序和日期的时间顺序完全一致,所以有两种简单的解决方式:
- 使用字符串的
localeCompare方法(推荐,不需要转换日期对象):
a.sort((c, d) => c.fecha.localeCompare(d.fecha))
- 转换成Date对象后做数值减法:
a.sort((c, d) => new Date(c.fecha) - new Date(d.fecha))
执行任意一种后,数组会被正确排序为:
[ { fecha: '2022-10-26', txt: 'some text' }, { fecha: '2022-10-27', txt: 'some text' }, { fecha: '2022-10-28', txt: 'some text' } ]
内容的提问来源于stack exchange,提问作者Bruja
相关产品推荐
相关产品推荐

