JavaScript对象数组多条件排序问题:代码错误排查与修正
问题
我正在开发一个小型应用,需要按两个值对JavaScript对象数组排序:一个是时间戳created_date,另一个是字符串sport。具体规则为:sport为cricket的对象排在最前,sport为空值的对象在后,且两类对象均按created_date升序排列。我尝试了以下代码片段,但无法满足需求,已给出预期结果,希望帮忙排查代码问题。
原代码片段
var content = [ { "first_name": "musk", "sport": "cricket", "created_date": "2022-08-12 04:03:08", }, { "first_name": "john", "sport": "", "created_date": "2022-08-01 23:00:46", }, { "first_name": "robot", "sport": "cricket", "created_date": "2022-08-10 23:00:46", }, { "first_name": "roy", "sport": "", "created_date": "2022-07-31 23:00:46", }, ] content.sort(function compare( a, b ) { if ( a.sport < b.sport || (new Date(a.created_date) < new Date(b.created_date))){ return 1; } if ( a.sport > b.sport || (new Date(a.created_date) < new Date(b.created_date)) ){ return -1; } return 0; }); console.log(content)
预期结果
var content = [ { "first_name": "robot", "sport": "cricket", "created_date": "2022-08-10 23:00:46", }, { "first_name": "musk", "sport": "cricket", "created_date": "2022-08-12 04:03:08", }, { "first_name": "roy", "sport": "", "created_date": "2022-07-31 23:00:46", }, { "first_name": "john", "sport": "", "created_date": "2022-08-01 23:00:46", }, ]
解决方案
原代码的问题在于比较函数逻辑混乱,错误地将sport比较和日期比较用||连接,导致排序规则冲突,同时还使用了HTML转义字符(<、>)而非实际的比较运算符。
正确的排序逻辑要分两步:
- 先按
sport优先级分组:cricket优先级高于空字符串,不同类型直接确定顺序。 - 当
sport类型相同时,按created_date升序排列(更早的日期在前)。
修正后的代码如下:
var content = [ { "first_name": "musk", "sport": "cricket", "created_date": "2022-08-12 04:03:08", }, { "first_name": "john", "sport": "", "created_date": "2022-08-01 23:00:46", }, { "first_name": "robot", "sport": "cricket", "created_date": "2022-08-10 23:00:46", }, { "first_name": "roy", "sport": "", "created_date": "2022-07-31 23:00:46", }, ] content.sort(function compare(a, b) { // 先处理sport优先级:cricket在前,空在后 if (a.sport === "cricket" && b.sport !== "cricket") { return -1; // a排前面 } if (a.sport !== "cricket" && b.sport === "cricket") { return 1; // b排前面 } // sport相同时,按created_date升序排列 const dateA = new Date(a.created_date); const dateB = new Date(b.created_date); return dateA - dateB; }); console.log(content);
逻辑说明
- 第一步判断:如果a是
cricket而b不是,a优先排在前面;反之则b在前。 - 第二步:当两者
sport类型一致时,将日期字符串转为Date对象,直接相减得到差值——日期更早的数值更小,以此实现升序排列。
内容的提问来源于stack exchange,提问作者Dinesh s
相关产品推荐
相关产品推荐

