Ошибка отправки в массив из вложенного цикла - PullRequest
0 голосов
/ 27 февраля 2020

Когда я запускаю это, все работает правильно, кроме массива. Console.log (messagesdata); показывает, что данные уведомлений получают свои значения обновлены правильно, но затем, глядя на console.log (уведомления), у меня есть 7 идентичных со значениями, соответствующими последнему из уведомлений. Каким-то образом загрузка в массив не происходит правильно, и я, кажется, не могу понять это. Есть идеи?

var notifications = [];
reminder.days.value = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
reminder.times = [00:00]

      var notificationdata = {
        title: "Nu är det dags att ta en dos",
        text: "Ta " + medication + " mot " + affliction + " nu.",
        smallIcon: "../images/DosAvi_badge.png",
        icon: "../images/DosAvi_icon.png",
        every: "week",
        foreground: true
      }
      notificationdata.id = reminder.id;
      for(const day of reminder.days.value){
        for(const time of reminder.times){
          notificationdata.firstAt = getNextDayOfTheWeek(day, new Date(`Mon Jan 01 2020 ${time}`));
          //notificationdata.firstAt = new Date(`Wen Feb 26 2020 21:55`);
          console.log(notificationdata);
          notifications.push(notificationdata);
        }
      }
      console.log(notifications)

      cordova.plugins.notification.local.schedule(notifications);
    }

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

notificationdata - это объект, и внутри вашего l oop вы просто изменяете свойство этого объекта. Pu sh к массиву добавляет ссылку на объект в массив. Таким образом, вы получите массив из 7 ссылок на один и тот же объект. Чтобы это исправить, сначала нужно скопировать объект:

      for(const day of reminder.days.value){
        for(const time of reminder.times){
          const copyNotificationdata = {
              ...notificationdata,
              firstAt: getNextDayOfTheWeek(day, new Date(`Mon Jan 01 2020 ${time}`))
          }
          notifications.push(copyNotificationdata);
        }
      }
0 голосов
/ 27 февраля 2020

Поскольку вы не создаете новый объект и просто используете его снова.

Javascript переменная объекта содержит только ссылку на объект. Это означает, что вы всегда обновляете одни и те же данные в памяти, и ваш массив содержит 7 ссылок на один и тот же объект.

Вы должны создать новый объект и вставить его в свой массив:

for(const day of reminder.days.value){
    for(const time of reminder.times){
        const newNotificationdata = { ...notificationData };
        newNotificationdata.firstAt = getNextDayOfTheWeek(day, new Date(`Mon Jan 01 2020 ${time}`));
        notifications.push(newNotificationdata);
    }
}
...