function max(data, key = n => n) {
const getVal = key instanceof Function ? key : n => n[key];
let result = null;
for (const n of data) {
const val = getVal(n);
result = (!result || result[1] < val) ? [ n, val ] : result;
}
return result?.[0];
}
const { text } = max(arr, n => n.text.length);
const oldest = max(arr, 'age');
const tableSelector = 'здесь селектор вашей таблицы';
const columnIndices = [ 8, 9, 10 ];
const $rows = $(`${tableSelector} tr`);
// или
const { rows } = document.querySelector(tableSelector);
$rows.each((_, n) =>
$('> *', n)
.filter(i => ~columnIndices.indexOf(i))
.remove()
);
$rows
.children(`${columnIndices.map(n => `:nth-child(${-~n})`)}`)
.detach();
Array.prototype.forEach.call(rows, function(n) {
for (let i = n.cells.length; i--; this.has(i) && n.deleteCell(i)) ;
}, new Set(columnIndices));
for (const { cells } of rows) {
columnIndices.map(n => cells[n]).forEach(n => n?.remove());
}
for (const n of rows) {
n.replaceChildren(...Array.prototype.filter.call(
n.cells,
(_, i) => !columnIndices.includes(i)
));
}
function getWeekdaysOfMonth(year, month) {
const date = new Date(year, --month, 1);
const result = [];
while (date.getMonth() === month) {
result.push(date.toLocaleString('ru-RU', {
month: 'long',
day: 'numeric',
weekday: 'long',
}));
date.setDate(date.getDate() + 1);
}
return result;
}
const weekdaysOfDecember2020 = getWeekdaysOfMonth(2020, 12);
но как поступить если я не хочу забирать дни недели из стандартного объекта. а взять из их своего массива?
const weekdays = [
'воскресенье',
'это понедельник',
'а это вторник',
'конечно же среда',
'четверг',
'пятница - прямо после четверга',
'суббота, рабочая неделя окончена',
];
const getWeekdaysOfMonth = (year, month) => Array.from(
{ length: new Date(year, month--, 0).getDate() },
(n, i) => {
const d = new Date(year, month, i + 1);
return d.toLocaleString('ru-RU', {
month: 'long',
day: 'numeric',
}) + ', ' + weekdays[d.getDay()];
});
const weekdaysOfFebruary2021 = getWeekdaysOfMonth(2021, 2);
document.querySelector('.products__body').addEventListener('click', e => {
const item = e.target.closest('.card-preview__item');
if (item) {
e.preventDefault();
const { srcset } = item.querySelector('source');
item.closest('.card').querySelector('.card-head__image source').srcset = srcset;
}
});
function merge(...$arrays) {
$result = [];
foreach ($arrays as $arr) {
foreach ($arr as $key => $values) {
if (!isset($result[$key])) {
$result[$key] = [];
}
for ($i = 0; $i < count($values); $i++) {
$result[$key][$i] = ($result[$key][$i] ?? 0) + $values[$i];
}
}
}
return $result;
}
$arr = merge($arr1, $arr2);
нужно отлавливать дата атрибуты и если эти дата атрибуты совпадают с дата атрибутами других блоков то вешать класс на блоки
on: {
slideChange() {
const index = this.realIndex;
document.querySelectorAll('.lol').forEach((n, i) => n.classList.toggle('active', i === index));
},
},
.clients__picture
все .lol
, вырезаете обработчик slideChange, добавляетеpagination: {
el: '.clients__picture',
bulletClass: 'lol',
bulletActiveClass: 'active',
renderBullet: (index, className) => `<div class="${className}">${index + 1}</div>`,
},
For DOM trees which represent HTML documents, the returned tag name is always in the canonical upper-case form.
if(str.tagName == 'ul') {
} else if (str.tagName == 'li') {
str
, что за странный выбор имени? Там же элемент, а не строка.elem.append('li');
for (let el of strLi) { el.addEventListener('click',func); };
func
вынесено за пределы текущей функции, иначе бы при каждом клике всем существующим li
добавлялся новый обработчик.li
, на свежесозданных li
клик обрабатываться не будет (касается и тех, что изначально существуют).li
- так зачем назначать отдельный обработчик клика? То, что делаете в func
, вполне можно делать прямо тут.document.querySelector('ul').addEventListener('click', e => {
const t = e.target;
const ct = e.currentTarget;
t.insertAdjacentHTML('beforeend', ct === t ? '<li>text</li>' : '!');
});
const parent = document.querySelector('ul');
.parent.querySelectorAll(':scope > *').forEach(n => parent.prepend(n));
// или
Element.prototype.append.apply(parent, [...parent.children].reverse());
// или
const [ first, ...rest ] = parent.children;
first?.before(...rest.reverse());
// или
for (const n of parent.children) {
parent.insertBefore(n, parent.firstElementChild);
}
// или
for (let i = parent.children.length; i--;) {
parent.insertAdjacentElement('beforeend', parent.children[i]);
}
// или
const elems = Array.from(parent.children);
while (elems.length) {
parent.appendChild(elems.pop());
}
let first =
вам следовало разместить внутри цикла, а не перед ним; во-вторых, проще всего получить цифру старшего разряда можно превратив число в строку и взяв нулевой символ. Т.е., вы пытались изобразить нечто подобное:for (const n of arr) {
const [ first ] = String(n);
if (first == 1 || first == 2 || first == 5) {
console.log(n);
}
}
// ...строкой
const first = '125';
const startsWithFirst = n => !!~first.indexOf(`${n}`[0]);
// ...массивом чисел
const first = [ 1, 2, 5 ];
const startsWithFirst = n => first.includes(n / (10 ** (Math.log10(n) | 0)) | 0);
// ...числом
const first = 0b100110;
const startsWithFirst = n => ((first >> ('' + n).charAt()) & 1) === 1;
// ...регулярным выражением
const first = /^[125]/;
const startsWithFirst = n => first.test(n);
// все сразу
console.log(arr.filter(startsWithFirst));
// или по одному
arr.forEach(n => startsWithFirst(n) && console.log(n));
новая_координата = Math.max(
минимальное_допустимое_значение,
Math.min(
максимальное_допустимое_значение,
текущая_координата + изменение_координаты
)
);
const getSrc = img => img.getAttribute('src');
// или
const getSrc = img => img.attributes.src.value;
const relativeOnly = f => img => {
const src = getSrc(img);
if (!/^https?:\/\//.test(src)) {
f(img, src);
}
};
document.querySelectorAll('img').forEach(relativeOnly((img, src) =>
img.outerHTML = `
<picture>
<source srcset="${src}" type="image/svg+xml">
${img.outerHTML}
</picture>`
));
const wrapImages = relativeOnly((img, src) => {
const picture = document.createElement('picture');
const source = document.createElement('source');
source.srcset = src;
source.type = 'image/svg+xml';
img.replaceWith(picture);
picture.append(source, img);
});
for (const n of document.getElementsByTagName('img')) {
wrapImages(n);
}
// или
Array.prototype.forEach.call(document.images, wrapImages);
const count = 10;
.const result = Array
.from({ length: count }, (n, i) => `"${-~i}"`)
.join(', ');
// или
const result = [...Array(count).keys()].reduce((acc, n) => {
return acc.concat(acc && ', ', '"', ++n, '"');
}, '');
// или
const result = (function xxx(n) {
return n > 0 ? xxx(n - 1) + (n === 1 ? '' : ', ') + '"' + n + '"' : '';
})(count);
// или
const result = Array(count)
.fill()
.map((n, i) => JSON.stringify((i + 1).toString()))
.toString()
.replace(/,/g, '$& ');
const buttonSelector = '.class2';
const classesToToggle = [ 'class3', 'class4' ];
$(buttonSelector).click(e => {
$(e.currentTarget).next().toggleClass(classesToToggle.join(' '));
});
document.querySelectorAll(buttonSelector).forEach(n => {
n.addEventListener('click', onClick);
});
function onClick() {
classesToToggle.forEach(n => this.nextElementSibling.classList.toggle(n));
}
document.addEventListener('click', e => {
const button = e.target.closest(buttonSelector);
if (button) {
for (const n of classesToToggle) {
button.parentNode.lastElementChild.classList.toggle(n);
}
}
});
const el = document.querySelector('#box');
const colors = [ 'red', 'green', 'blue' ];
let index = -1;
el.addEventListener('mouseenter', function() {
index = (index + 1) % colors.length;
this.style.backgroundColor = colors[index];
});
el.addEventListener('mouseleave', function() {
this.style.backgroundColor = '';
});