JS цикл ставит неверное значение
У меня есть функция создающая 14 дней от 'сегодня' и пушащия их в option для select. Пытаюсь реализовать заполнение значение value: 0 - воскресенье, 1 - сегодня, 2 - остальные дни. Моя функция ставит по итогу всем единицы так как сравнивает значение getDate() только на сегодня, а не на каждый день - не доходят мозги как надо изменть цикл for и проверку в нем:
function getDates(node) {
let test = new Date()
let testNow = test.getTime()
let testDayNow = Number(test.getDay())
let f = 0
let data = []
data.push(test)
for (let i = 0; i < 14; i++) {
let para = document.createElement("option");
console.log(f)
let curData = new Date(testNow + f * 3600 * 1000)
let formatedDate = curData.toLocaleDateString('ru-RU', {
month: 'long',
day: 'numeric'
})
f = f + 24
para.innerHTML = formatedDate
para.value = i
if (test.getDay() == 0) {
para.value = 0
console.log(para.value)
} else if (testDayNow == test.getDay()) {
para.value = 1
console.log(para.value)
} else {
para.value = 2
console.log(para.value)
}
node.appendChild(para)
}
console.log(data)
}
getDates(document.getElementById('t'));
<div id="t"></div>
Ответы (2 шт):
Вы в начале функции определили переменную test, затем переменной testDayNow присвоили значение Number(test.getDay()) и дальше в цикле сравнивали эти значения друг с другом, они естественно всегда равны.
Переменную testDayNow вы нигде в цикле не переопределяли.
В цикле вы создаете переменную curData, вот с ней и надо сравнивать:
function getDates(node) {
let test = new Date()
let testNow = test.getTime()
let testDayNow = Number(test.getDay())
let f = 0
let data = []
data.push(test)
for (let i = 0; i < 14; i++) {
let para = document.createElement("option");
console.log(f)
let curData = new Date(testNow + f * 3600 * 1000)
let formatedDate = curData.toLocaleDateString('ru-RU', {
month: 'long',
day: 'numeric'
})
f = f + 24
para.innerHTML = formatedDate
para.value = i
if (curData.getDay() == 0) {
para.value = 0
console.log(para.value)
} else if (curData.getDate() == test.getDate()) {
para.value = 1
console.log(para.value)
} else {
para.value = 2
console.log(para.value)
}
node.appendChild(para)
}
console.log(data)
}
getDates(document.getElementById('t'));
<div id="t"></div>
Вы в вопросе сами ответили на свой вопрос. Вы каждую итерацию сравниваете сегодняшний день недели с сегодняшним днем недели.
let testDayNow = Number(test.getDay())
//...
} else if (testDayNow == test.getDay()) { test.getDay() == test.getDay() ???
Вы же создаете каждую итерацию новую дату curDate, вот и сравнивайте с ней.
const select = document.querySelector('#dates');
(function getDates(node) {
const test = new Date();
let testNow = test.getTime();
let testDayNow = test.getDay(); // Оборачивать в Number не обязательно, метод getDay() и так возвращает number
let data = [];
data.push(test);
function _isToday(date) {
return date.valueOf() === test.valueOf();
}
function _isSunday(date) {
return date.getDay() === 0;
}
for (let i = 0; i < 14; i++) {
const option = document.createElement("option");
const currentDate = new Date(testNow + i*24 * 3600 * 1000); // вместо создания переменной и присваиваний f += 24 можно просто умножать i на 24
const formatedDate = currentDate.toLocaleDateString('ru-RU', {
month: 'long',
day: 'numeric'
});
/** такая конструкция с switch будет читаемей */
switch(true) {
case _isToday(currentDate): {
option.value = 1;
break;
}
case _isSunday(currentDate): {
option.value = 0;
break;
}
default: {
option.value = 2;
break;
}
}
option.textContent = formatedDate + `(${option.value})`; // добавил скобки для наглядности.
node.appendChild(option);
}
})(select);
<select name="dates" id="dates"></select>