Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归调用未捕获_Javascript_Html_Css_Web_Recursion - Fatal编程技术网

Javascript 递归调用未捕获

Javascript 递归调用未捕获,javascript,html,css,web,recursion,Javascript,Html,Css,Web,Recursion,我正在为学校做一个项目 项目中有课程,但课程有以前的课程 课程如下所示: "id": "math3", "previous": ["math2", "math1"], "name":"Gestión de Proyectos", "proffesor":"Viviana Rocco

我正在为学校做一个项目

项目中有课程,但课程有以前的课程

课程如下所示:

"id": "math3",
        "previous": ["math2", "math1"],
        "name":"Gestión de Proyectos",
        "proffesor":"Viviana Rocco",  
        "credits":"4,5",
        "description":""
我有一个课程列表,在课程中还有其他以前的课程。此外,当所有课程都显示时,我有一个HTML,所以我想做一个函数,如果我们将鼠标悬停在课程框上,前面的课程框就会改变颜色

所以我做了这个函数:

function paint(id) {
        for (i = 0; i < courses.length; i++) {
    
            if (materias[i].id === id && (courses[i].previous.length > 0)) {
    
                for (j = 0; j < courses[i].previous.length; j++) {

                    if (courses[i].previous[j] !== null) {
                        document.getElementById(courses[i].previous[j]).style.backgroundColor = "rgba(255,99,71,0.5)";
                        document.getElementById(courses[i].previous[j]).style.boxShadow = "0px 0px 0px 0.2rem rgba(220,20,60,0.5)";
                        paintPrevious(courses[i].previous[j]);
                    }
                }
            }
        }
    }
    }

    function paintPrevious(courseId){
        for (i = 0; i < courses.length; i++) {
            if (courses[i].id === courseId) {
                if(courses[i].previous !== null && courses[i].previous.length > 0){
                    for(j = 0; j < courses[i].previous.length; j++){  // This line the exception
                        document.getElementById(courses[i].previous[j]).style.backgroundColor = "rgba(214, 132, 56,0.5)";
                        document.getElementById(courses[i].previous[j]).style.boxShadow = "0px 0px 0px 0.2rem rgba(220,20,60,0.5)"
                        console.log("pinto")
                        paintPrevious(materias[i].hijo[j]); // recursive call
                    }
                }
            }
        }
    }

这里有几个问题。首先,我在评论中提到了命名问题。第二个事实是你正在检查
courses[i].previous[j]!=null,当不需要时,但如果是,您可能需要检查
未定义的
。。。您可以通过选中
!=空值
(一等于符号。)

但是最大的问题是你没有声明你的循环变量
i
j
未声明,因此是全局的。当您在
paintPrevious
内部更改
i
时,您也在
paint
内部更改它。将(i=0;…)
更改为(让i=0;…)
和类似的
j
可以解决您的问题

const课程=[
{id:“math1”,name:“Class 1”},
{id:“math2”,前一个:[“math1”],名称:“Class 2”},
{id:“math3”,前一个:[“math2”,“math1”],名称:“Class 3”}
]
//从课程中构建HTML。
courses.forEach(course=>document.getElementById('courses')。innerHTML+=
`${course.name}(先决条件:${(course.previous | | |[])。加入(',')})`
)
//测试油漆功能
油漆('math3')
功能漆(id){
for(设i=0;i0)){
for(设j=0;j0){
对于(设j=0;j

courses[i]
但是这样一个变量从未定义过,变量名是
courses
整个
courses
结构是什么样子的?这一行是一个courses数组,
if(materialas[i].id==id&(courses[i].previous.length>0))
,您尝试访问
courses[i].previous的
length
属性,而不首先检查
courses[i].previous
是否存在。此外,该行使用
“materials”
。那应该是“课程”吗?如果你解决了这些问题,它能解决你的问题吗?这些都没问题,材料和课程都一样。翻译问题呵呵
Uncaught TypeError: Cannot read property 'previous' of undefined