document.addEventListener('click', function(e) {
if (e.target.classList.contains('sbros')) {
for (let el = e.target; el = el.previousElementSibling;) {
if (el.classList.contains('fields')) {
el.value = el.getAttribute('default-value');
break;
}
}
}
});
document.addEventListener('click', ({ target: t }) => {
if (t.matches('.sbros')) {
const el = t.closest('здесь селектор обёртки').querySelector('.fields');
el.value = el.getAttribute('default-value');
}
});
const inputs = document.querySelectorAll('.fields');
const buttons = [...document.querySelectorAll('.sbros')];
buttons.forEach(n => n.addEventListener('click', onClick));
function onClick(e) {
const el = inputs[buttons.indexOf(e.target)];
el.value = el.getAttribute('default-value');
}
const chunkSize = 10;
.const arr = [];
let i = -1;
for (const k in obj) {
const j = (++i / chunkSize) | 0;
(arr[j] = arr[j] || {})[k] = obj[k];
}
const chunked = (arr, chunkSize) =>
Array.from(
{ length: Math.ceil(arr.length / chunkSize) },
(n, i) => arr.slice(i * chunkSize, (i + 1) * chunkSize)
);
const arr = chunked(Object.keys(obj), chunkSize).map(n => {
return n.reduce((acc, k) => (acc[k] = obj[k], acc), {});
});
function* chunked(data, chunkSize) {
const iter = data[Symbol.iterator]();
for (let chunk = [], n = {}; !n.done && (n = iter.next());) {
if ((n.done && chunk.length) || (!n.done && chunk.push(n.value) === chunkSize)) {
yield chunk;
chunk = [];
}
}
}
const arr = Array.from(chunked(Object.entries(obj), chunkSize), Object.fromEntries);
event.target.tagName != 'button'
В XML (и XML-подобных языках) возвращаемое значение будет в нижнем регистре, а в HTML - в верхнем.
event.target.classList.contains('remove-button')
// или
event.target.matches('.remove-button')
$('.show').click(function() {
$(this).hide().next('.var').slideDown().find('.hide').show();
});
$('.hide').click(function() {
$(this).hide().closest('.var').slideUp().prev('.show').show();
});
rating = Math.max(1, Math.ceil((e.clientX - горизонтальнаяКоординатаЭлемента) / ширинаЭлемента * 5))
function group(data, key, val = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const getVal = val instanceof Function ? val : n => n[val];
const result = {};
for (const n of data) {
const k = getKey(n);
(result[k] = result[k] || []).push(getVal(n));
}
return result;
}
group(arr, 'room')
// или
group(arr, n => n.room)
group(Array(5).keys(), n => n % 2 ? 'нечётные' : 'чётные')
group('a8-C!39', n => (
n.toLowerCase() !== n.toUpperCase() ? 'буква' :
!Number.isNaN(+n) ? 'цифра' :
'другое'
))
<input name="xxx" value="69">
<input name="xxx" value="187">
<input name="xxx" value="666">
<input name="yyy" value="-1">
group(document.querySelectorAll('input'), 'name', n => +n.value)
const containers = document.querySelectorAll('.counts');
const tag = 'div';
const className = 'count';
const count = 3;
const html = [...Array(count)]
.map((_, i) => `<${tag} class="${className}">${i + 1}</${tag}>`)
.join('');
for (const n of containers) {
n.insertAdjacentHTML('beforeend', html);
}
for (let i = 0; i < containers.length; i++) {
for (let j = 0; j < count;) {
const el = document.createElement(tag);
el.classList.add(className);
el.innerText = ++j;
containers[i].appendChild(el);
}
}
const fragment = document.createDocumentFragment();
fragment.append(...Array.from({ length: count }, (_, i) => (
Object.assign(document.createElement(tag), {
textContent: -~i,
className,
})
)));
containers.forEach(n => n.append(fragment.cloneNode(true)));
const siblings = Array.prototype.filter.call(
this.parentNode.children,
n => n !== this
);
const siblings = [];
for (let el = this; (el = el.previousElementSibling); siblings.unshift(el)) ;
for (let el = this; (el = el.nextElementSibling); siblings.push(el)) ;
$('.openFormPopup').click(e => $('#btn-clicked').val(e.target.dataset.title));
const asyncForEach = (data, callback) =>
Array.prototype.reduce.call(
data,
(promise, n, i, a) => promise.then(() => callback(n, i, a)),
Promise.resolve()
).then(() => {});
// или
async function asyncForEach(data, callback) {
for (const [ i, n ] of data.entries()) {
await callback(n, i, data);
}
}
asyncForEach(
document.querySelectorAll('li'),
li => new Promise(r => setTimeout(() => r(console.log(li.textContent)), 1000))
);
Здесь только регуляркой или как?
function incrementNumberInString(str) {
for (let i = 0, iNum = -1; i < str.length; i++) {
if ('0123456789'.includes(str[i])) {
if (iNum === -1 && str[i - 1] === '[') {
iNum = i;
}
} else if (iNum !== -1 && str[i] === ']') {
return str.slice(0, iNum) + (Number(str.slice(iNum, i)) + 1) + str.slice(i);
} else {
iNum = -1;
}
}
return str;
}
str.replace(/(?<=\[)\d+(?=\])/, m => ++m)
// или
str.replace(/\[\d+\]/, m => '[' + (m.slice(1, -1) - -1) + ']')
// или
str.replace(/\[(\d+)\]/, (m, g1) => `[${-~g1}]`)
const newArr = [];
for (const n of arr) {
const [ us, s ] = n.us.split('-').map(n => n.split('_').map(Number));
newArr.push({
...n,
us: arr1.filter(n => us.includes(n)),
s,
});
}
const newArr = arr.map(function(n) {
const us = n.us.match(/\d+/g).map(n => +n);
const s = us.splice(-1);
return {
id: n.id,
us: this(us),
s,
};
}, us => arr1.filter(Set.prototype.has.bind(new Set(us))));
const getFreeDomainsCount = arr => arr
.map(n => n.split('@')[1])
.filter(n => freeEmailDomains.includes(n))
.reduce((acc, n) => (++acc[n], acc), Object.fromEntries(freeEmailDomains.map(n => [ n, 0 ])));
const obj = arr.find(n => n.id === newObj.id);
if (obj) {
Object.assign(obj, newObj);
} else {
arr.push(newObj);
}