const options = [
[ 'hello, world!!', 'fuck the world', 'fuck everything' ],
500,
console.log,
];function interval(arr, delay, callback) {
let i = -1;
return arr.length
? setInterval(() => callback(arr[i = -~i % arr.length]), delay)
: null;
}
const intervalId = interval(...options);
// надо остановить хождение по кругу, делаем так: clearInterval(intervalId);function interval(arr, delay, callback) {
let timeoutId = null;
arr.length && (function next(i) {
timeoutId = setTimeout(() => {
callback(arr[i]);
next((i + 1) % arr.length);
}, delay);
})(0);
return () => clearTimeout(timeoutId);
}
const stop = interval.apply(null, options);
// надо остановить, делаем так: stop();
function xxx(key) {
let val = entityTree[key];
const nextKey = Array.isArray(val) && (val = [...val], val.pop());
return val ? [].concat(key, val, xxx(nextKey)) : [];
}
Нужно сделать обычную регулярку, которая бы проверяла наличие кириллицы и пробелов.
// проверяем, что строка содержит и первое, и второе
/(?=.*[А-ЯЁ])(?=.* )/i.test(str)
// проверяем, что ничего другого в строке нет
/^[А-ЯЁ ]*$/i.test(str)Нужно полностью исключить кирилицу и пробелы.
// проверяем отсутствие
/^[^А-ЯЁ ]*$/i.test(str)
// удаляем
str.replace(/[А-ЯЁ ]/gi, '')
if (obj.hasOwnProperty(key)) {
if (!Array.isArray(obj[key])) {
obj[key] = [ obj[key] ];
}
obj[key].push(val);
} else {
obj[key] = val;
}это для массива, а у меня объект
Array.isArray проверяйте instanceof Object. А ключ нового свойства - это количество уже существующих свойств:if (obj.hasOwnProperty(key)) {
if (!(obj[key] instanceof Object)) {
obj[key] = { 0: obj[key] };
}
obj[key][Object.keys(obj[key]).length] = val;
} else {
obj[key] = val;
}
.next на .active + *.// назначаем класс после создания элементов
for (let i = times.length; i--;) {
if (new Date(times[i]) <= date) {
result.children[i].classList.add('active');
break;
}
}
// или, параллельно
result.append(...times.map((n, i, { [-~i]: m = +date + 1 }) => {
const p = document.createElement('p');
p.textContent = n;
p.classList.toggle('active', new Date(n) <= date && date < new Date(m));
return p;
}));
users.filter(u => u.services.some(s => filterBy.every(f => s.categories.includes(f))))users.filter(u => filterBy.every(f => u.services.some(s => s.categories.includes(f))))users.filter(u => filterBy.some(f => u.services.some(s => s.categories.includes(f))))
$('.products').append(data.uslugi.map(item => `
<div class="item p-2">
<img src="${item.img}" alt="" class="p-2 h-64 mx-auto">
<h2 class="text-lg text-center font-semibold p-1 pb-0">${item.title}</h2>
<div class="flex flex-wrap w-56 mx-auto py-2 pt-0 text-lg sizes">
${item.size.map(size => `
<div class="p-1 flex size">
<span class="px-2 rounded-full size active">${size}</span>
</div>
`).join('')}
</div>
</div>
`).join(''))
const form = document.querySelector('.form');
const items = [...form.querySelectorAll('.form__item')];
form.addEventListener('change', function(e) {
const index = items.indexOf(e.target.closest('.form__item'));
form.querySelector('.form__progress-line').style.width = (index + 2) * 100 / items.length + '%';
setTimeout(() => {
items[index]?.classList.remove('form__item--active');
items[index + 1]?.classList.add('form__item--active');
if (index + 1 === items.length) {
form.style.display = 'none';
document.querySelector('.result').classList.add('result--active');
}
}, 1000);
});
form.dispatchEvent(new Event('change'));
const pr = new Intl.PluralRules('ru');
const rules = [
{ one: 'минута', few: 'минуты', many: 'минут' },
{ one: 'секунда', few: 'секунды', many: 'секунд' },
];
function getTimeStr(minutes, seconds) {
const t = minutes || seconds;
return `Осталось ${t} ${rules[+!minutes][pr.select(t)]}`;
}<div className={s.container}>{getTimeStr(+minutes, +seconds)}</div>
$(window).scroll(function() {
const $banner = $('.banner');
const bannerHeight = $banner.outerHeight(true);
const bannerTop = parseInt($banner.css('top'), 10);
const windowTop = $(this).scrollTop();
$banner.toggleClass('hide', $('.fullwidth').get().some(n => {
const $n = $(n);
const nTop = $n.offset().top - bannerTop;
const minTop = nTop - bannerHeight;
const maxTop = nTop + $n.outerHeight(true);
return windowTop > minTop && windowTop < maxTop;
}));
});
const join = val =>
Array.isArray(val)
? val.flat(Infinity).join('')
: `${val}`;const join = val =>
val instanceof Array
? val.reduce((acc, n) => acc + join(n), '')
: val + '';function join(val) {
const result = [];
const stack = [];
for (let i = -1, arr = [ val ]; ++i < arr.length || stack.length;) {
if (i === arr.length) {
[ i, arr ] = stack.pop();
} else if (arr[i]?.constructor === Array) {
stack.push([ i, arr ]);
[ i, arr ] = [ -1, arr[i] ];
} else {
result.push(arr[i]);
}
}
return ''.concat(...result);
}
$('form').on('input', function() {
$('#submit-about').prop('disabled', ![
$('#name-about').val().length !== 0,
$('#phone-about').val().length === 16,
$('#personaldata-about').prop('checked'),
].every(Boolean));
});
.dropdown {
display: none;
}
.dropdown.show {
display: block;
}const headerSelector = '.tabs__head';
const contentSelector = '.dropdown';
const activeClass = 'show';// делегирование, назначаем обработчик клика один раз для всех хедеров;
// контент, соответствующий нажатому хедеру, находим через значение атрибута href
document.addEventListener('click', ({ target: t }) => {
const header = t.closest(headerSelector);
if (header) {
document.querySelectorAll(contentSelector).forEach(function(n, i) {
n.classList[n === this ? 'toggle' : 'remove'](activeClass);
}, document.querySelector(header.attributes.href.value));
}
});
// или, назначаем обработчик клика каждому хедеру индивидуально;
// контент, соответствующий нажатому хедеру, определяем по равенству индексов
const headers = document.querySelectorAll(headerSelector);
const contents = document.querySelectorAll(contentSelector);
headers.forEach(n => n.addEventListener('click', onClick));
function onClick() {
const index = Array.prototype.indexOf.call(headers, this);
contents.forEach((n, i) => n.classList[i === index ? 'toggle' : 'remove'](activeClass));
}
$('.price_tabs-content button').click(function() {
const $this = $(this);
const on = $this.siblings('p').toggleClass('on').hasClass('on');
$this.text(on ? 'Закрыть' : $this.data('text'));
}).each((i, n) => $(n).data('text', $(n).text()));$('.price_tabs-content button').click(function() {
$(this).hide().next().show().end().prev().addClass('on');
}).after('<button>Закрыть</button>').next().hide().click(function() {
$(this).hide().prev().show().prev().removeClass('on');
});
const random = arr => arr[Math.random() * arr.length | 0];const check = count === random([
count1 + count2,
count1 - count2,
count1 * count2,
count1 / count2,
]);const operations = [
(a, b) => a + b,
(a, b) => a - b,
(a, b) => a * b,
(a, b) => a / b,
];
const check = count === random(operations)(count1, count2);const check = count === eval(count1 + random('+-*/') + count2);