You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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转义字符(&lt;、&gt;)而非实际的比较运算符。

正确的排序逻辑要分两步:

  1. 先按sport优先级分组:cricket优先级高于空字符串,不同类型直接确定顺序。
  2. 当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:39:13