Почему не работает склонение час/часа/часов?
Хочу чтобы при каждой генерации нового числа к нему добавлялось час/часа/часов назад. Сейчас выводится второй вариант "часа", т.е 23 часа, 5 часа и т.д.
Собственно вопрос, что необходимо поставить вместо 2, чтобы определялось число getRandomNumber и склонения были правильными?
function declOfNum(number, titles) {
cases = [2, 0, 1, 1, 1, 2];
return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
window.onload = function fillDiv() {
document.querySelectorAll('.vertical__date').forEach(el => {
const number = getRandomNumber(1, 24) + declOfNum(2, [' час', ' часа', ' часов']) + ' назад';
el.textContent = number;
})
}
function getRandomNumber(min, max) {
const numbers = [...document.querySelectorAll('.vertical__date')].map(el => +el.textContent || 0);
let random_number = Math.floor(Math.random() * (max - min)) + min;
return !numbers.includes(random_number) ? random_number : getRandomNumber(min, max);
}
<div class="vertical__date"></div>
<div class="vertical__date"></div>
<div class="vertical__date"></div>
<div class="vertical__date"></div>
Ответы (2 шт):
Автор решения: Quazimorda
→ Ссылка
Например, так:
window.onload = function fillDiv(){
document.querySelectorAll('.vertical__date').forEach(el => {
const h = getRandomNumber(1,24);
const number = h + declOfNum(h, [' час', ' часа', ' часов']) + ' назад';
el.textContent = number;
})
}
И да, у вас в примере не используется библиотека jquery - наверное тег лучше в вопросе убрать.
Автор решения: another_login
→ Ссылка
Если минимально редактировать исходный вариант, получается так:
function declOfNum(number, titles) {
cases = [2, 0, 1, 1, 1, 2];
return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
window.onload = function fillDiv() {
document.querySelectorAll('.vertical__date').forEach(el => {
const number = getRandomNumber(1, 24);
const text = number + declOfNum(number, [' час', ' часа', ' часов']) + ' назад';
el.textContent = text;
})
}
function getRandomNumber(min, max) {
const numbers = [...document.querySelectorAll('.vertical__date')].map(el => +el.textContent || 0);
let random_number = Math.floor(Math.random() * (max - min)) + min;
return !numbers.includes(random_number) ? random_number : getRandomNumber(min, max);
}
<div class="vertical__date"></div>
<div class="vertical__date"></div>
<div class="vertical__date"></div>
<div class="vertical__date"></div>