function shortNumber(val) {
const abs = Math.abs(val);
const prefixIndex = Math.log10(abs) / 3 | 0;
return (
(val < 0 ? '-' : '') +
Math.round(abs / (10 ** (prefixIndex * 3))) +
'KMGTPEZY'.charAt(~-prefixIndex)
);
}
shortNumber(99) // '99'
shortNumber(1945) // '2K'
shortNumber(-5839465) // '-6M'
shortNumber(7e10) // '70G'
const filterSelector = '.js-filter';
const itemSelector = '.dfth__item';
const checkboxSelector = '.dfth__check:checked';
const labelSelector = '.dfth__label';
const resetSelector = '.dfth__reset';
const selectedSelector = '.js-type-result';
const defaultValue = 'ничего не выбрано';
const $filter = $(filterSelector).change(function() {
const selected = $(checkboxSelector, this)
.closest(itemSelector)
.find(labelSelector)
.get()
.map(n => $(n).text())
.join(', ');
$(selectedSelector, this).text(selected || defaultValue);
});
$filter.find(resetSelector).click(() => {
$filter.find(checkboxSelector).prop('checked', false);
$filter.trigger('change');
});
const filter = document.querySelector(filterSelector);
filter.addEventListener('change', ({ currentTarget: ct }) => {
const selected = Array
.from(
ct.querySelectorAll(checkboxSelector),
n => n.closest(itemSelector).querySelector(labelSelector).textContent)
.join(', ');
ct.querySelector(selectedSelector).textContent = selected || defaultValue;
});
filter.querySelector(resetSelector).addEventListener('click', () => {
filter.querySelectorAll(checkboxSelector).forEach(n => n.checked = false);
filter.dispatchEvent(new Event('change'));
});
methods: {
setDeleteTimeout(message) {
message.timeout = setTimeout(this.удалитьСообщение, 5000, message);
},
delDeleteTimeout(message) {
clearTimeout(message.timeout);
message.timeout = null;
},
...
<div
v-for="n in messages"
@mouseenter="delDeleteTimeout(n)"
@mouseleave="setDeleteTimeout(n)"
...
document.querySelectorAll('.col').forEach(n => {
n.querySelectorAll('a').forEach((m, i) => m.classList.toggle('d-none', !!i));
});
document.querySelectorAll('.col a').forEach(n => {
n.classList.toggle('d-none', !!n.previousElementSibling);
});
$('#cityFilter').on('input', function() {
const value = this.value.toLowerCase();
$('#city-list .city')
.hide()
.filter((i, n) => $(n).text().toLowerCase().includes(value))
.show();
$('#city-list .state')
.hide()
.filter((i, n) => $(n).nextUntil('.state').is(':visible'))
.show();
});
document.querySelector('#cityFilter').addEventListener('input', e => {
const value = e.target.value.toLowerCase();
document.querySelectorAll('#city-list li').forEach(function(n) {
if (n.matches('.state')) {
this.splice(0, 2, n, true);
} else {
const hide = n.textContent.toLowerCase().indexOf(value) === -1;
this[1] &&= hide;
n.classList.toggle('hidden', hide);
if (!n.nextElementSibling?.matches('.city')) {
this[0].classList.toggle('hidden', this[1]);
}
}
}, [ null, true ]);
});
const result = Array.prototype.flatMap.call(
document.forms,
function(form) {
return form.className.match(this) ?? [];
},
/(?<=(^| )js-)[a-z-]*(?=-form( |$))/g
);
const result = [];
const reg = /^js-([a-z-]*)-form$/;
for (const form of document.querySelectorAll('form')) {
for (const cls of form.classList) {
const name = reg.exec(cls)?.[1];
if (name != null) {
result.push(name);
}
}
}
key={elem * Math.random()}
при добавлении новых 20 в массив перерисовываются ещё и старые 300
const SHOW_INITIAL = 2;
const SHOW_MORE = 3;
const $button = $('.btn-search-more');
const $items = $('.catalog-list__items-top').hide();
showItems(SHOW_INITIAL);
$button.click(() => showItems(SHOW_MORE));
function showItems(count) {
const $hidden = $items.filter(':hidden');
$hidden.slice(0, count).show();
$button.toggle($hidden.length > count);
}
const point = { latitude: lat, longtitude: lon };
const closest = arr.reduce((closest, n) => {
const d = sphericalDistance(point, n);
return d < closest[1] ? [ n, d ] : closest;
}, [ null, Infinity ])[0];
function sphericalDistance(p1, p2) {
// https://en.wikipedia.org/wiki/Great-circle_distance
}
def nested_to_plain(obj):
result = {}
for key, val in obj.items():
if type(val) == dict:
result.update({ key + '.' + k: v for k, v in nested_to_plain(val).items() })
else:
result[key] = val
return result
document.querySelector('.calendar-days').addEventListener('click', e => {
if (e.target.classList.contains('calendar-day-hover')) {
currDate = new Date(curr_year.value, curr_month.value, e.target.innerText);
document.querySelector('.heading').innerText = currDate.toLocaleDateString('ru-RU');
e.currentTarget.querySelector('.curr-date')?.classList.remove('curr-date');
e.target.classList.add('curr-date');
}
});
const remove = str => str.split(' ').slice(0, -1).join(' ');
// или
const remove = str => str.replace(/\s\S+$/, '');
// или
const remove = str => str.match(/.+(?=\s)/);
// или
const remove = str => str.slice(0, str.lastIndexOf(' '));
for (const n of document.getElementsByClassName('startdate')) {
n.textContent = remove(n.textContent);
}
// или, раз уж полной даты уже не будет, пусть начало и конец интервала дат
// располагаются внутри одного элемента - вместе с куском строки также
// удаляем и родительский элемент
document.querySelectorAll('.startdate').forEach(n => {
n.outerHTML = remove(n.innerHTML);
// или
n.replaceWith(remove(n.innerText));
});