Array.prototype.sort()在Firefox生效但Chrome无效?求原因解析
问题原因及修复方案
你的排序函数不符合Array.sort()的规范要求,这是导致跨浏览器表现不一致的核心原因。
Array.sort()的比较函数必须返回负数、0或正数:
- 返回负数:第一个参数应排在第二个参数前面
- 返回0:两个元素相对位置保持不变
- 返回正数:第一个参数应排在第二个参数后面
而你当前的代码返回的是布尔值(true/false),虽然浏览器会自动将布尔值转为数字(true对应1,false对应0),但这个逻辑存在严重缺陷:
- 当
new Date(a) < new Date(b)成立时返回1,这会让a排在b之后(和你想要的升序逻辑相反) - 其他所有情况都返回0,这会让浏览器的排序算法无法正确判断元素的相对位置。由于Chrome和Firefox采用的排序实现不同,这种不完整的返回值会导致Chrome中排序失效,而Firefox碰巧表现出你预期的结果。
修复后的代码
要实现升序排序(旧日期在前),直接返回两个日期对象的差值(日期对象相减会自动转为时间戳差值):
person_json[0].events.sort(({date:a}, {date:b}) => new Date(a) - new Date(b));
如果需要降序排序(新日期在前),则反转差值:
person_json[0].events.sort(({date:a}, {date:b}) => new Date(b) - new Date(a));
内容的提问来源于stack exchange,提问作者George Shalhoub
相关产品推荐
相关产品推荐

