未捕获的类型错误:无法读取未定义的属性“开始”

Posted

技术标签:

【中文标题】未捕获的类型错误:无法读取未定义的属性“开始”【英文标题】:Uncaught TypeError: Cannot read property 'start' of undefined 【发布时间】:2015-11-01 00:54:11 【问题描述】:

我有一个这样的列表,其中包含 1000 多个条目。

[
    
        "start": "Sun May 24 2015 01:00:00 GMT+0530 (IST)",
        "end": "Sun May 24 2015 01:30:00 GMT+0530 (IST)",
        "title": "Event 1"
    ,
    
        "start": "Sun May 24 2015 04:00:00 GMT+0530 (IST)",
        "end": "Sun May 24 2015 06:00:00 GMT+0530 (IST)",
        "title": "Event 2"
    
]

我正在写一个像这样的函数:-

function finalIndex(ind)
           
            var final_ind = ind+1;
            var chkdate = new Date(list[ind].start);
            var day = chkdate.getDate();
            //alert(day);
            var chkdate1 = new Date(list[final_ind].start);
            var day1 = chkdate.getDate();
            //alert(day1);
            final_ind = final_ind+1;
            while(day == day1)
               
                chkdate1 = new Date(list[final_ind].start);
                day1 = chkdate.getDate();
                final_ind = final_ind+1;
            
            final_ind = final_ind-1;
            return final_ind;
        

在这个函数中 ind 是给定日期的起始索引,在这个函数的帮助下,我想找出与给定日期关联的最终对象的索引。

外部的注释警报运行正常,并显示 24,24 作为输出。

但是我得到 Uncaught TypeError: Cannot read property 'start' of undefined 虽然它能够读取 list[final_ind].start 在循环之前。

【问题讨论】:

final_ind = final_ind+1; 将导致 while 循环内的 final_ind 与 while 循环外的 final_ind 不同。这可能会导致数组查找返回 undefined。 没有得到你...???我在 chkdate1 = new Date(list[final_ind].start);在while循环内。 final_ind = final_ind+1; while(day == day1) chkdate1 = new Date(list[final_ind].start); 我只是增加了 var final_ind 【参考方案1】:

只需更改:

while(day == day1)

到:

while(day == day1 && list[final_ind])

或:

while(day == day1 && list.length > final_ind)

解释

最后一个循环越界了,添加这个你确定对象存在。

【讨论】:

现在错误消失了,但现在 while 循环一直持续到最后,尽管我只有 10 个日期 = 24 的条目; 要获得您想要的结果,请将循环内的行 day1 = chkdate.getDate(); 更改为 day1 = chkdate1.getDate(); HeartBeat 是对的,我第一眼没看到。【参考方案2】:

当您的函数在最后一个索引上运行时,您的 final_ind = ind+1 分配一个不存在的索引,当它到达 chkdate1=new Date(list[final_ind].start) 时,它会抛出一个错误,因为该项目不存在。通过将此行添加为函数的第一个行来检查您是否位于最后一项,从而避免这种情况:if(ind >= list.length-1) return


无论如何。我正在阅读您的代码,我个人认为您需要重新思考并重新编写您想要实现的目标。这没有多大意义,而且有很多冗余。

【讨论】:

嗯,你可以提出更好的方法来做到这一点。这对像我这样的初学者会有很大帮助。 我认识我的朋友。我想回答这个问题,但发现太多了。我没有时间提出那么多建议,而是重新考虑了这一点。希望有人可以帮助你更多。现在我很着急:(对不起。

以上是关于未捕获的类型错误:无法读取未定义的属性“开始”的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义和未处理的承诺拒绝的属性“捕获”

未捕获的类型错误:无法读取未定义的属性“ContentContainer”[关闭]

未捕获的类型错误:无法读取未定义的属性(读取“使用”)

未捕获的类型错误:无法读取未定义的属性“authenticateClientAndRetrieveSessionId”

未捕获的类型错误:无法读取未定义的属性“区域”?

错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`