JavaScript合并PHP返回数组后按created_at字段排序结果不符合预期
问题根因
你遇到的排序异常和数组拆分无关,本质是你的排序逻辑没有生效:
created_at是DD/MM/YYYY格式的字符串,直接用-运算符计算时,字符串无法被隐式转换为合法数字,最终返回NaN- JS的
Array.sort()方法如果回调函数返回NaN,不会调整两个对比元素的原有相对顺序,因此数组顺序和你先后push两个数组的顺序完全一致,才会出现第一个数组元素永远排在第二个数组元素前面的现象。
修正代码
排序前先将created_at字符串按格式拆解为合法的日期对象,再用时间戳比较即可:
// 数组合并逻辑不需要修改 history.push(...response.data[0]); history.push(...response.data[1]); history.sort((a, b) => { // 拆解 DD/MM/YYYY 格式的日期,注意JS月份从0开始计数 const [aDay, aMonth, aYear] = a.created_at.split('/').map(Number); const aTimestamp = new Date(aYear, aMonth - 1, aDay).getTime(); const [bDay, bMonth, bYear] = b.created_at.split('/').map(Number); const bTimestamp = new Date(bYear, bMonth - 1, bDay).getTime(); // 按日期升序排列,如需降序改为 return bTimestamp - aTimestamp return aTimestamp - bTimestamp; });
优化建议
如果可以调整后端返回逻辑,建议让Laravel直接返回created_at的ISO标准日期字符串(如2021-09-08T00:00:00Z)或Unix时间戳,前端可以直接比较,无需额外做日期格式解析。
内容的提问来源于stack exchange,提问作者Ali Gökmen Kudaş
相关产品推荐
相关产品推荐

