如何使用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')); // 捕获排序顺序错误
关键细节
- 使用
hasOwnProperty检查字段,避免误判对象继承的属性 - 用解构赋值简化元素交换逻辑,代码更简洁
- 创建数组副本
[...arr],防止原数据被意外修改 catch块用console.error输出错误,比console.log更醒目,同时返回原数组保证调用逻辑稳定
内容的提问来源于stack exchange,提问作者eduardo
相关产品推荐
相关产品推荐

