TypeError:无法读取未定义的属性(读取“长度”) - 想解释一下代码为什么这么说
2021-11-26
4944
任务:创建一个函数,如果内部数组包含特定数字,则删除数组的外部元素。即filteredArray([[10, 8, 3], [14, 6, 23], [3, 18, 6]], 18)应返回[[10, 8, 3], [14, 6, 23]]
如果可能的话,我希望解释一下代码在导致此错误时究竟在做什么/读取什么,而不仅仅是解决方案。
我已将我的思考过程作为注释包含在此代码中 - 所以如果我在某个地方错了,希望可以指出。
function filteredArray(arr, elem) {
let newArr = [];
// Only change code below this line
newArr = [...arr]; //copying the arr parameter to a new arr
for (let i=0; i< newArr.length; i++){ //iterating through out array
for (let x= 0; x< newArr[i].length; x++){ //iterating through inner array
if(arr[i][x] === elem){ //checking each element of the inner array to see if it matches the elem parameter
newArr.splice(i, 1); //if true, removing the entire outer array the elem is inside
}
}
}
// Only change code above this line
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
2个回答
当您在最后一次迭代中找到值时,您可以拆分外部数组并继续迭代内部数组,但使用外部数组的原始索引。通过缩短长度,它现在指向长度,并且任何尝试使用属性访问
undefined
的行为都会出错。
为了克服这个问题并保持外部索引正确,您可以从最后一个索引开始并向后迭代。
除此之外,您可以中断内部搜索,因为在找到时,您不需要更多来迭代此数组。
Nina Scholz
2021-11-26
当您尝试访问
未定义
的变量的属性时,会发生此错误。
您很可能从以下行获得此信息:
for (let x= 0; x< newArr[i].length; x++){
如果您的参数
arr
不是数组,则
newArr[0]
将未定义,因此`newArr[0].lenght将引发此错误。
Tom
2021-11-26