const add = (str, val) =>
str.replace(/\d+$/, m => `${+m + val}`.padStart(m.length, 0));
add('string0001', 1) // 'string0002'
add('string1010', 99) // 'string1109'
add('string2345', 6789) // 'string9134'
string99 + 1
должно быть равно string00
, а не string100
), то после вызова padStart
добавьте .slice(-m.length)
. <p class="typeit">hello, world!!</p>
<p class="typeit">fuck the world</p>
<p class="typeit">fuck everything</p>
const typeit = Array.from(
document.querySelectorAll('.typeit'),
(n, i) => new TypeIt(n, {
cursor: false,
afterComplete: () => typeit[i + 1]?.go(),
})
);
typeit[0].go();
const firstNonRepeatingLetter = str =>
[...str].find((n, i, a) => a.indexOf(n) === a.lastIndexOf(n)) || '';
const firstNonRepeatingLetter = str =>
str.charAt(Array
.from(str.toLowerCase())
.findIndex((n, i, a) => a.indexOf(n) === a.lastIndexOf(n))
);
function calc(val = 0) {
const self = {
add: v => (val += v, self),
sub: v => (val -= v, self),
mul: v => (val *= v, self),
div: v => (val /= v, self),
pow: v => (val **= v, self),
toString: () => val,
};
return self;
}
calc().add(5).mul(5) + 1 // 26
+calc(100).div(10).sub(2) // 8
`${calc(2).pow(10)}` // "1024"
const sum = (data, getVal) => Object
.values(data instanceof Object ? data : {})
.reduce((acc, n) => acc + sum(n, getVal), getVal(data));
sum([ 1, 2, 3, '1', [ '2', 4, [ '3' ] ], '4' ], x => +(typeof x === 'string')) // 4
sum({ a: { b: [ NaN, Infinity ], c: 123456 } }, x => +(typeof x === 'number')) // 3
function sum(a) {
const f = b => sum(a + b);
f.valueOf = () => a;
return f;
}
sum(1)(2)(3) + 4 // 10
sum(5) * sum(6) // 30
700 / sum(7) // 100
Math.pow(sum(8), 2) // 64
// но если попутно не выполняется никаких числовых операций, придётся немного поработать руками:
+sum(9)(10) // 19
Number(sum(11)(12)) // 23
const dropdown = document.querySelector('.dropdown-el');
const activeClass = 'expanded';
dropdown.addEventListener('click', e => {
e.preventDefault();
e.stopPropagation();
e.currentTarget.classList.toggle(activeClass);
e.target.previousElementSibling.checked = true;
});
document.addEventListener('click', () => dropdown.classList.remove(activeClass));
priceData.map(n => ({
...n,
services: n.services.filter(m => m.name.toLowerCase().includes('вакцина')),
}));
Object.values(arr.reduce((acc, n) => {
if (n) {
const k = n[0];
acc[k] = acc[k]?.length > n.length ? acc[k] : n;
}
return acc;
}, {}))
"пик" это элемент массива с длиной больше чем предыдущий элемент и следующий
arr.filter((n, i, a) => a[i - 1]?.length < n.length && n.length > a[i + 1]?.length)
const input = document.querySelector('.inputprice');
const container = document.querySelector('.inner');
const itemSelector = '.box';
const buttonSelector = `${itemSelector} .btn`;
const valueSelector = `${itemSelector} .box-title`;
container.addEventListener('click', ({ target: t }) => {
const item = t.closest(buttonSelector)?.closest(itemSelector);
if (item) {
input.value = item.querySelector(valueSelector).innerText;
}
});
// или
const onClick = el => input.value = el.textContent.trim();
container.querySelectorAll(buttonSelector).forEach(function(n, i) {
n.addEventListener('click', onClick.bind(null, this[i]));
}, document.querySelectorAll(valueSelector));
.comment-item.active .comment-item__form {
display: block;
}
const itemSelector = '.comment-item';
const buttonSelector = '.comment-item__reply';
const activeClass = 'active';
document.addEventListener('click', e => {
const item = e.target.closest(buttonSelector)?.closest(itemSelector);
if (item) {
document.querySelectorAll(itemSelector).forEach(n => {
n.classList.toggle(activeClass, n === item);
});
}
});
const numChunks = 6;
const chunkLen = arr.length / numChunks | 0;
const chunks = Array.from({ length: numChunks }, (n, i) => {
return arr.slice(i * chunkLen, i === numChunks - 1 ? arr.length : (i + 1) * chunkLen);
});
removeEventListener
не то, что передавали в addEventListener
. Смотрите сами:document.addEventListener('click', clickerOut(parent));
document.removeEventListener('click', clickerOut);
clickerOut(parent)
и clickerOut
- это что по-вашему, одно и то же? Никак нет.function clickerOut(parent) {
return function handler(e) {
...
document.removeEventListener('click', handler);
}
}
const arr = Object
.entries(obj)
.reduce((acc, [ k, v ]) => (
k = k.match(/([a-z]+)(\d+$)/),
(acc[k[2]] ??= {})[k[1]] = v,
acc
), []);
const os = Object.fromEntries(arr.map(n => [ n.system, 0 ]));
const count = arr.reduce((acc, n) => ((acc[n.name] ??= { ...os })[n.system]++, acc), {});
console.log(Object
.entries(count)
.map(n => `${n[0]}: ${Object.entries(n[1]).map(m => m.join(' - ')).join(', ')}`)
.join('\n')
);
$('.el1--closed').one('click', function() {
$(this)
.siblings()
.slideToggle();
});
$('.block').on('click', '.el1--closed', function() {
$(this)
.removeClass('el1--closed')
.siblings()
.slideToggle();
});