开发者问题收集

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