【问题标题】:Javascript function returning "cannot read property length of undefined"返回“无法读取未定义的属性长度”的 Javascript 函数
【发布时间】:2020-11-04 03:01:56
【问题描述】:

我正在尝试创建一个函数,该函数接受一个包含嵌套数组和一个数字的数组。我用作参数的数组表示不同学生出现在课堂上的时间,每个嵌套数组是一组时间。该数字代表开始上课时需要出现的最少学生人数。每个嵌套数组中的值都是数字,这些数字必须为 0 或负数。如果 0 和负数的数量等于或大于课程开始所需的学生人数,则该函数应将一个真正的布尔值推送到该函数稍后将返回的数组中。如果没有足够的学生,它必须将一个假布尔值推入同一个数组。因此,如果我们有 3 个嵌套数组,第一个包含足够的学生,而另外两个没有,则返回结果应该是 [true, false, false]。 这是我到目前为止所写的:

function openings (arrayOfTimes, studentsRequired){
    const openWhen = [];
    for (let i = 0; i <= arrayOfTimes.length; i++){ 
        var x = arrayOfTimes[i]; 
        for (let j = 0; j <= x.length; j++){ 
            let y = x[i]; 
            let z = [];
            if (y <= 0){
                z.push(y);
            }
            let open = true; 
            if (z.length >= studentsRequired){ 
                openWhen.push(open);
            }
            let notOpen = false;
             if (z.length < studentsRequired){
                openWhen.push(notOpen);
            }
        }
    }
    return openWhen;
}

console.log(openings([[1,2,0],[0,0,-1],[-2,-3,0]],2));

输出说“无法读取未定义的属性长度”,看到错误日志表明未定义的属性是x。

这是我第一次在另一个 for 循环中同时使用嵌套数组和 for 循环。我感谢任何关于我哪里出错的见解和解释。 非常感谢。

【问题讨论】:

  • 如果错误是关于x.length,那么arrayOfTimes 中的至少一项本身不是数组或类似数组的对象,并且没有length。您应该编辑您的问题并显示您如何调用openings 以及您传递给它的数据。
  • @scrappedcola 请不要要求将代码发布到第三方网站,因为这些链接可能会随着时间的推移而失效。可执行代码可以通过 Stack Snippet 直接放在问题中。
  • @ScottMarcus 我已经对其进行了编辑以显示我是如何称呼它的。
  • 请使用足够的代码再次更新它以重现相关错误。此时,我们得到"Uncaught ReferenceError: esteIngreso is not defined"
  • @ScottMarcus 看来我落后了。注意到

标签: javascript arrays for-loop nested


【解决方案1】:

在您的 for 循环中,您使用的是 i &lt;= arrayOfTimes.lengthj &lt;= x.length。如果您将这些循环更改为使用i &lt; arrayOfTimes.lengthj &lt; x.length,它们将正常工作。请记住,数组的第一个元素的索引为 0,这意味着数组的长度将始终比数组的最大索引大 1。

我已经重新编写了函数以使其更简单一些,并且我已经对其进行了测试。它为每个子数组返回一个布尔值,如果子数组至少包含小于 1 的最小数量的值,则返回 true。

function openings (timesArray, minimum) {
   return timesArray.map((times) => {
      return times.filter(time => time < 1).length >= minimum;
   });
}

您的示例输入

console.log(openings([[1,2,0],[0,0,-1],[-2,-3,0]],2));
// returns [ false, true, true ]

【讨论】:

  • 这样做我仍然收到相同的错误消息。关于为什么会发生这种情况的任何线索?谢谢!
  • @LuisArgüelles 检查我的答案
  • 您可能需要重新加载您正在使用的页面、IDE 等。我知道这听起来很愚蠢,但老实说,我经常忘记自己做这件事。
  • 我已经检查了两倍,它可以工作,但现在我正在为每个嵌套数组中的每个值获取单独的结果。我需要每个嵌套数组有一个布尔值。我真的不知道这是否是我的源代码、我的解释的问题,或者您提供的解决方案是否恰好错过了它。非常感谢您抽出时间来回答这个问题,所以如果您能帮助我解决这个问题,那将意义重大。
  • 我想我在查看代码时找到了答案,我接受你的答案!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2012-10-21
  • 2017-04-28
相关资源
最近更新 更多