开发者问题收集

为什么我会收到“未捕获的类型错误:无法读取未定义的属性(读取‘序列’)”?

2022-02-19
880
const rndInt = Math.floor(Math.random() * 50);
 const arr = [];
 const input = document.getElementById('answer').value;

function displaySeq() {
        var i = 0;
        while (arr.length < 21) {
          arr[i] = {
              sequence: [],
              answer,
              guess: []
          };
          i++;

          for (j=0; j < 7; j++) {
              arr[i].sequence[0] = rndInt;
              arr[i].sequence.push(rndInt + j)
          }
       }  
        console.log(arr);
    }

我知道这个错误意味着变量没有值,但我不确定该怎么做才能解决。

另一个不相关的问题是,我的目标是每次迭代时,每个数组的第一个元素都是一个新的随机整数。现在每个数组都是相同的随机整数。有办法解决这个问题吗?

2个回答

arr[0] 为空时,您无法访问它。因此,首先,您必须将其推送到数组,然后调用 arr[0]

此外,您正在增加 i ,然后将其推送到数组中。因此,最初,您在定义 arr[0] 之前访问 arr[1]

请尝试此方法:

function displaySeq() {
     var i = 0;
     while (arr.length < 21) {
         arr.push({
             sequence: [],
             answer,
             guess: []
         });
         for (j=0; j < 7; j++) {
             arr[i].sequence[0] = rndInt;
             arr[i].sequence.push(rndInt + j)
         }
         i++;
     }  
     console.log(arr);
}
Muhammed Jaseem
2022-02-19

观察: 在创建数组对象并尝试访问 i 索引处的数组对象后,您正在增加 i

简单地说,您尝试访问 arr[i+1] ,因为此时 arr 中只有一个元素。

解决方案: 在完成 for 循环后增加索引 i++

演示:

const rndInt = Math.floor(Math.random() * 50);
const arr = [];

function displaySeq() {
  var i = 0;
  while (arr.length < 21) {
    arr[i] = {
      sequence: [],
      answer: [],
      guess: []
    };

    for (j = 0; j < 7; j++) {
      arr[i].sequence[0] = rndInt;
      arr[i].sequence.push(rndInt + j)
    } 
    
    i++;
  }  
  console.log(arr);
}

displaySeq();
Rohìt Jíndal
2022-02-25