Получить предыдущий номер в цикле при сохранении в переменную - PullRequest
3 голосов
/ 22 апреля 2019

еще новичок в изучении JavaScript.Я хочу перебрать некоторые значения.Если значение больше или равно определенному числу, то прервите цикл и получите предыдущее число.Например:

var time = [14, 35];
var interval = 40; // in minutes
var startTime = [10, 40];

var timeFormatted = '2019-02-04 '+time[0]+':'+time[1];
var startTimeFormatted = '2019-02-04 '+startTime[0]+':'+startTime[1];

var dtTime = new Date(timeFormatted);
var dtStartTime = new Date(startTimeFormatted);

var currentTime = dtStartTime;
for(i = 0; i < 20; i++) {
    var previouslySelectedTime = currentTime;
    currentTime.setMinutes(currentTime.getMinutes() + interval);
    currentTime = new Date(currentTime);
    if(currentTime >= dtTime) {
        break;
    }
}

alert(previouslySelectedTime);

Конечный результат времени beforeTime должен быть 14:00:00, но он показывает 14:40:00.Что может быть не так?

Ответы [ 4 ]

5 голосов
/ 22 апреля 2019

Вы можете использовать do while для этой цели

, где цикл повторяется по крайней мере один раз перед оценкой условия, если true, продолжите, иначе остановите.

var time = [14, 35];
var interval = 40; // in minutes
var startTime = [10, 40];

var timeFormatted = '2019-02-04 '+time[0]+':'+time[1];
var startTimeFormatted = '2019-02-04 '+startTime[0]+':'+startTime[1];

var dtTime = new Date(timeFormatted);
var dtStartTime = new Date(startTimeFormatted);

var currentTime = dtStartTime;
var previouslySelectedTime = null;
do {
    var previouslySelectedTime = currentTime;
    currentTime.setMinutes(currentTime.getMinutes() + interval);
    currentTime = new Date(currentTime);

} while (!(currentTime < dtTime));

alert(previouslySelectedTime);
5 голосов
/ 22 апреля 2019

Если вы посмотрите на currentTime, он ссылается на объект Дата . Итак, при выполнении следующего кода:

var previouslySelectedTime = currentTime;

переменная previouslySelectedTime будет ссылаться на тот же объект, на который ссылается currentTime. Затем вы выполните:

currentTime.setMinutes(currentTime.getMinutes() + interval);

, который изменит объект, на который ссылаются оба, currentTime и previouslySelectedTime. Простым решением этой проблемы будет создание нового Date из currentTime перед присвоением его указанной переменной:

var previouslySelectedTime = new Date(currentTime);

Кроме того, после исправления, нет необходимости в следующей строке:

currentTime = new Date(currentTime);
* ** 1 022 тысяча двадцать-один * Пример

var time = [14, 35];
var interval = 40; // in minutes
var startTime = [10, 40];

var timeFormatted = '2019-02-04 ' + time[0] + ':' + time[1];
var startTimeFormatted = '2019-02-04 ' + startTime[0] + ':' + startTime[1];

var dtTime = new Date(timeFormatted);
var currentTime = new Date(startTimeFormatted);
var previouslySelectedTime;

for (let i = 0; i < 20; i++)
{
    previouslySelectedTime = new Date(currentTime);
    currentTime.setMinutes(currentTime.getMinutes() + interval);

    if (currentTime >= dtTime)
        break;
}

alert(previouslySelectedTime);

Упрощенная версия:

Более того, вы могли бы сделать некоторые упрощения в своем коде, если бы использовали методы, которые предоставляет объект Date() и цикл while.

var time = [14, 35];
var interval = 40; // in minutes
var startTime = [10, 40];

var dtTime = new Date();
dtTime.setHours(time[0], time[1], 0);
var currentTime = new Date();
currentTime.setHours(startTime[0], startTime[1], 0);
var previouslySelectedTime;

while (currentTime < dtTime)
{
    previouslySelectedTime = new Date(currentTime);
    currentTime.setMinutes(currentTime.getMinutes() + interval);    
}

alert(previouslySelectedTime);
2 голосов
/ 22 апреля 2019

Небольшое изменение может решить вашу проблему.

var previouslySelectedTime = new Date(currentTime);//line no : 10

Причина:

здесь javascript только для копирования. Вот почему при изменении currentTime также изменяются и ранее выбранные значения.

Решение:

Вам следует подать Глубокая копия здесь.

https://medium.com/@Farzad_YZ/3-ways-to-clone-objects-in-javascript-f752d148054d

1 голос
/ 22 апреля 2019

Вы создаете ссылку следующей строкой

var previouslySelectedTime = currentTime;

Так что после этого, когда вы устанавливаете Минуты на currentTime, это также меняет previouslySelectedTime

. Вам нужно скопировать значениеcurrentTime, а затем присвойте его previouslySelectedTime, используя JSON.parse(JSON.stringify())

var time = [14, 35];
var interval = 40; // in minutes
var startTime = [10, 40];

var timeFormatted = '2019-02-04 '+time[0]+':'+time[1];
var startTimeFormatted = '2019-02-04 '+startTime[0]+':'+startTime[1];

var dtTime = new Date(timeFormatted);
var dtStartTime = new Date(startTimeFormatted);

var currentTime = dtStartTime;
var previouslySelectedTime;

for(let i = 0; i < 20; i++) {
    previouslySelectedTime = JSON.parse(JSON.stringify(currentTime));
    currentTime.setMinutes(currentTime.getMinutes() + interval);
    currentTime = new Date(currentTime);
    if(currentTime >= dtTime) {
        break;
    }
    
}

console.log(previouslySelectedTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...