For循环TypeScript中所有值均替换为最后一个值

时间:2019-05-21 10:24:10

标签: javascript typescript

我在javascript中有一个for循环,用于合并 calendarEvents 中的数据:

drop(info) {
    var that = this;
    var startDate = info.date;
    var frequency = this.skippingNumber;

    for (var i = 0; i <= 3; i++) {
      (function (start) {
        that.calendarEvents = that.calendarEvents.concat({
          title: 'Dropped Event',
          start: start,
          allDay: info.allDay
        });
      })(startDate);
      startDate = this.addDays(startDate, frequency);
    }
  }

addDays(date: Date, days: number): Date {
    var passedDate = date;
    passedDate.setDate(passedDate.getDate() + days);
    return passedDate;
  }

如果我在循环中登录 startDate ,则会得到实际值,即星期一,星期二,星期三,星期四。但是,当我登录 calendarEvents 时,我得到的只是每个数据中的星期四。 谁能帮我这个? 在此先感谢!!

2 个答案:

答案 0 :(得分:3)

addDays()的所有调用均作为参数接收,修改并返回相同的对象(var startDate = info.date)。

重写addDays()方法以创建并返回一个新的Date对象:

addDays(date: Date, days: number): Date {
    var passedDate = new Date(date.getTime());
    passedDate.setDate(passedDate.getDate() + days);
    return passedDate;
}

答案 1 :(得分:0)

在循环运行时,您只有一个startdate对象正在变异。完成后,您将拥有一个包含对同一对象的引用的数组。

一种解决方法是在将开始日期对象连接到数组之前先克隆它:

(function (start) {
    that.calendarEvents = that.calendarEvents.concat({
      title: 'Dropped Event',
      start: new Date(start.getTime()),
      allDay: info.allDay
    });
  })(startDate);

尽管如建议的那样,最好重写您的addDays函数,以免使您传入的日期对象发生变化。在可能的情况下,函数不应使它们的输入发生变化。