How can I get rid of error - TypeError: Cannot read property '8' of undefined

How can I get rid of error - TypeError: Cannot read property '8' of undefined

while 语句不断抛出错误(TypeError:无法读取未定义的 属性 '8'),但是 console.log 仍然输出它想要的结果。

 var hold = [];
 for (let i = 0; i < (clothes.length - 1); i++) {
   let count = 0;
   if (hold.length === 0) {
     hold.push(clothes[i]);
   } else {
     console.log(clothes[i][8], hold[count][8]);
     while (clothes[i][8] < hold[count][8]) {
       count++;
     }
     hold.slice(count, 0, clothes[i]);
   }
 }

这部分代码递增 count 超出了 hold[]

的长度
while (clothes[i][8] < hold[count][8]){
  count ++;
};

手动单步执行:

  • 衣服[0]被“if hold is empty clause”添加为 hold[0]
  • clothes[1] 与 hold[0] 进行比较并且是 < 所以 count++
  • clothes[1] 与 hold[1] 进行比较,但没有 hold[1],因此出现错误

while

中添加一个子句
while (count < hold.length && clothes[i][8] < hold[count][8]){
  count ++;
};

注意 必须首先检查长度,否则你仍然会得到相同的错误(还有其他方法,例如 while 之外的 break)。 && 的第二部分是 only valuated 如果第一部分是 true


您有其他问题停止完整的解决方案:

for (let i = 0; i < (clothes.length - 1); i++){

将循环到长度为 1,所以如果你有 3 个元素,你只会得到两个。您需要使用 或者

  • i<clothes.length
  • i<=(clothese.length-1)

hold.slice(count, 0, clothes[i]);

不是 .slice 和切片 returns 新数组的语法,不会就地更改数组。这应该是

hold.splice(count, 0, clothes[i]);

提供更新的代码段:

var clothes = [[2],[1],[3]];

var hold = []
for (let i = 0; i < clothes.length; i++) {
  var count = 0;
  if (hold.length === 0) {
    hold.push(clothes[i]);
  } else {
    while (count<hold.length && clothes[i][0] < hold[count][0]) {
      count++;
    };
    if (count == hold.length) {
      hold.push(clothes[i])
    }
    else  {
      hold.splice(count, 0, clothes[i]);
    }
  }
}
console.log(hold.join(","));