反应:无法读取未定义的属性“ times”尽管定义了“ times”?

时间:2019-11-20 17:14:52

标签: javascript reactjs datepicker

我的应用程序发生了奇怪的行为。我有以下DatePicker,如下所示:

  <DatePicker
  inline
  minDate={moment().add(1, "day").utc().toDate()}
  maxDate={moment().add(7, "day").utc().toDate()}
  selected={selectedDate ? selectedDate : moment().utc().toDate()}
  onChange={this.onDateSelect}/>

如果我将这样的代码保留下来,则应用程序可以正常运行,但是如果我将minDate从1更改为-say- 25,然后将maxDate从7更改为35,那么我会在此代码行上收到上述错误: / p>

以下是在reducer中,其initialState定义为:

const initialState = {
    days: [],
    times:[],
    schedule: {},
    rescheduled: false
};

  > let times = dayList.find(day => Boolean(day.selected) === true).times.filter(time => Boolean(time.available) === true);

我不确定times如果在这里明确定义了,为什么会变得不确定?

任何反馈或帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果Array#find函数未“找到”任何内容-返回未定义。

显然,这就是为什么您收到错误消息:

dayList.find(day => Boolean(day.selected) === true).times
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> undefined

我建议您确保没有定义times

const getTimes = (dayList) => {
   const time = dayList.find(day => Boolean(day.selected) === true);

   if (time && Array.isArray(time.times)) {
      return time.times.filter(n => Boolean(n.available) === true);
   }
};

注意:您还应该检查time.times是否为数组,以在其上正确使用Array#filter

答案 1 :(得分:1)

错误并不表示times未定义。就是说它无法读取times对象的undefined属性。如果您有一个名为entry的变量,那么您说entry.times仅在将entry定义为一个对象时才有效。但是,如果执行此操作,则会收到此错误:

let entry;
entry.times = [];  // <-- fails because entry is undefined

看看您的代码,您有:

dayList.find(day => Boolean(day.selected) === true).times.filter(time => Boolean(time.available) === true);

因此,我猜测.times之前的部分被评估为undefined。我的意思是

dayList.find(day => Boolean(day.selected) === true)  ===  undefined

您没有提供足够的信息来知道dayList数组中的对象种类,但是如果dayList.find()找不到任何内容,它将返回undefined,然后您尝试访问undefined.times会导致您看到错误。

我建议将此行分成几个单独的部分,以便您只能尝试访问已知存在的数据。例如:

const item = dayList.find(day => Boolean(day.selected) === true);
if (item) {
  const times = item.times;
  // do something with the times array...
}
else // report that no day could be found, or whatever is appropriate

答案 2 :(得分:1)

当您忘记声明变量时,例如在严格模式下发生的ReferenceError可能会令人困惑。 console.log(iDontExist)

但是,Property accessorobj.property中的点运算符)在对象的属性不存在时返回值undefined,例如

const obj = {property: 1}
console.log(obj.iDontExist) // undefined

问题是undefined本身的行为不同,当您尝试访问undefined.property时会抛出错误,例如:

const obj = {property: 1}
console.log(obj.iDontExist.whatever) // ???

该错误在不同的JS实现中有所不同,例如在Firefox中:

TypeError: obj.iDontExist is undefined

在Chrome和Node.js中:

Uncaught TypeError: Cannot read property 'whatever' of undefined

在边缘:

Unable to get property 'whatever' of undefined or null reference

答案 3 :(得分:0)

  > let x = dayList.find(day => Boolean(day.selected) === true).times.filter(time => Boolean(time.available) === true);

在这里左右链接属性。如果您说哪个属性给您带来麻烦,而不是说“ X”,则回答起来会容易得多。

.find()方法可能在某时找不到任何东西,当您访问.times时,它说.find()的结果是不确定的,或者是.times.filter()。

每次使用.find()时,都应将结果存储在变量中,并在尝试执行任何操作之前检查其是否具有值。