【问题标题】:All Values replaced by last value in For loop TypeScriptFor循环TypeScript中的所有值都替换为最后一个值
【发布时间】:2019-05-21 10:24:10
【问题描述】:

我在 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 时,我得到的所有数据都是星期四。 谁能帮我这个? 提前致谢!!

【问题讨论】:

  • 您的 startDate 是同一个对象,并且您每次都在传递对它的引用。
  • addDays() 的所有调用都作为参数接收,修改并返回相同的对象 (var startDate = info.date)。
  • 看看here

标签: javascript typescript


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:

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

    一种解决方法是在将 startdate 对象连接到数组之前对其进行克隆:

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

    尽管按照建议,最好重写您的 addDays 函数,这样它就不会改变您传入的日期对象。在可能的情况下,函数不应改变它们的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多