运行JS代码报错Cannot read property 'sort' of undefined,哪里出错了?
报错根因
Cannot read property 'sort' of undefined
这个报错完全是因为你写了items.value.sort这行代码导致的:items是一个存储对象的数组,数组本身没有value属性,value是数组里每一个子对象的属性,所以items.value的取值结果是undefined,你尝试在undefined上调用sort方法就会触发这个错误。
其他代码问题
- 命名冲突:你的函数名、内部累加变量都叫
sort,属于重复命名,会引发不可预期的逻辑错误 - 逻辑匹配错误:从变量命名来看你是想实现限重下的最大价值计算,你累加的是物品的
value,却和最大重量maxWeight做比对,逻辑完全不匹配 - 排序逻辑错误:你想按物品的
value倒序排列,正确写法是直接对items数组调用sort方法,在排序回调中比对两个元素的value值 - 分支逻辑错误:你原有代码中累加值小于等于最大重量就break跳出循环,逻辑完全倒置,会导致刚进入循环就直接跳出,拿不到正确结果
修正后代码
const items = [ { id: 1, value:5, weight: 14 }, { id: 2, value:8, weight: 3 }, { id: 3, value: 10, weight: 8}, { id: 4, value: 2, weight: 4}, ]; // 给maxWeight加const声明,避免成为全局变量 const maxWeight = 15; // 修改函数名避免命名冲突 function getMaxValue() { // 正确的按value倒序排序写法 items.sort((a, b) => b.value - a.value); let totalValue = 0; let usedWeight = 0; for(let i = 0; i < items.length; i++) { const currentItem = items[i]; // 判断加入当前物品后是否超重 if (usedWeight + currentItem.weight <= maxWeight) { totalValue += currentItem.value; usedWeight += currentItem.weight; } } console.log('最大可带价值为:', totalValue); } getMaxValue();
修正说明
- 修正了排序写法,直接对items数组排序,通过回调比对子元素的value属性实现倒序
- 修正了命名冲突问题,避免同名变量覆盖
- 拆分了总价值、已用重量两个累加变量,逻辑更清晰
- 修正了判断逻辑,先判断是否超重再决定是否累加物品,符合背包问题的常规逻辑
内容的提问来源于stack exchange,提问作者Jan Tomczak
相关产品推荐
相关产品推荐

