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

如何使用Try/Catch捕获冒泡排序中不存在的参数错误?

解决方案:捕获不存在的排序字段错误

你的代码目前的问题是:当传入不存在的prop时,访问arr[j][prop]只会得到undefined,不会主动抛出错误,因此catch块无法触发。要实现需求,需要主动校验参数合法性,并在不合法时抛出错误,具体实现如下:

  • 先校验排序字段prop:检查数组元素是否包含该属性,不存在则抛出错误
  • 额外校验排序顺序ord:仅当ord为'asc'或'desc'时执行排序,否则抛出错误
  • 建议创建数组副本再操作,避免修改原数据

修改后的完整代码:

const data = [
    {
        "color": "Blue",
        "door": 3,
        "wheel": 3,
        "year": 2005,
        "brand": "GMC",
        "sold": false,
        "owner": "Chalmers Boobyer",
        "motor": 1.7,
        "assembled": "09/08/2022"
    },
    {
        "color": "Indigo",
        "door": 4,
        "wheel": 4,
        "year": 1996,
        "brand": "Lincoln",
        "sold": true,
        "owner": "Morten Coffin",
        "motor": 1.7,
        "assembled": "26/08/2021"
    }
];

function bubbleSort(arr, ord, prop){
    try{
        // 校验数组是否为空
        if(arr.length === 0){
            throw new Error("排序数组不能为空");
        }
        // 校验排序字段是否存在
        if(!arr[0].hasOwnProperty(prop)){
            throw new Error(`排序字段 "${prop}" 不存在于数据对象中`);
        }
        // 校验排序顺序是否合法
        if(!['asc', 'desc'].includes(ord)){
            throw new Error(`排序顺序 "${ord}" 不合法,仅支持 'asc' 或 'desc'`);
        }

        // 创建数组副本,避免修改原数组
        const sortedArr = [...arr];
        
        if(ord === 'asc'){
            for(let i = 0; i < sortedArr.length; i++){
                for(let j = 0; j < sortedArr.length - 1 - i; j++){
                    if(sortedArr[j][prop] > sortedArr[j+1][prop]){
                        [sortedArr[j], sortedArr[j+1]] = [sortedArr[j+1], sortedArr[j]];
                    }
                }
            }
        } else if(ord === 'desc'){
            for(let i = 0; i < sortedArr.length; i++){
                for(let j = 0; j < sortedArr.length - 1 - i; j++){
                    if(sortedArr[j][prop] < sortedArr[j+1][prop]){
                        [sortedArr[j], sortedArr[j+1]] = [sortedArr[j+1], sortedArr[j]];
                    }
                }
            }
        }
        return sortedArr;
    } catch(err){
        console.error('排序出错:', err.message);
        // 返回原数组,避免调用方获取undefined
        return arr;
    }
}

// 测试用例
console.log(bubbleSort(data, 'asc', 'wheel')); // 正常排序
console.log(bubbleSort(data, 'asc', 'nonExist')); // 捕获字段不存在错误
console.log(bubbleSort(data, 'wrongOrd', 'wheel')); // 捕获排序顺序错误

关键细节

  1. 使用hasOwnProperty检查字段,避免误判对象继承的属性
  2. 用解构赋值简化元素交换逻辑,代码更简洁
  3. 创建数组副本[...arr],防止原数据被意外修改
  4. catch块用console.error输出错误,比console.log更醒目,同时返回原数组保证调用逻辑稳定

内容的提问来源于stack exchange,提问作者eduardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:50:26