$('.elem_block').on('click', '.dell', function() {
$(this).closest('.block').addClass('fx_none');
$('.no-res').toggleClass('fx_none', !!$('.block:not(.fx_none)').length);
});document.addEventListener('click', e => {
const btn = e.target.closest('.dell');
if (btn) {
btn.closest('.block').classList.add('fx_none');
document.querySelector('.no-res').classList.toggle(
'fx_none',
!!document.querySelector('.block:not(.fx_none)')
);
}
});fx_none вырезаем.no-res и .elem_block добавляем общую обёртку, какой-нибудь <div class="container">.dell вместо добавления класса, скрывающего элементы, удаляем их по-настоящему:document.querySelectorAll('.dell').forEach(function(n) {
n.addEventListener('click', this);
}, e => e.target.closest('.block').remove());.no-res, если в .elem_block что-то есть:.container:has(.elem_block *) .no-res {
display: none;
}.no-res надо в том случае, если существует .block без класса, которые его скрывает:.container:has(.block:not(.fx_none)) .no-res {
display: none;
}
const controls = document.querySelectorAll('.segmented-control');
controls.forEach(n => n.addEventListener('change', updatePillPosition));
window.addEventListener('resize', () => controls.forEach(n => updatePillPosition.call(n)));
function updatePillPosition() {
const inputs = [...this.querySelectorAll('.option input')];
const x = this.offsetWidth / inputs.length * inputs.findIndex(n => n.checked);
this.querySelector('.selection').style.transform = `translateX(${x}px)`;
}
const SHOW_ON_LOAD = 3;
const SHOW_MORE = 2;
const items = [...document.querySelectorAll('.box-list__item')];
const button = document.querySelector('.show-more');
showItems(SHOW_ON_LOAD);
button.addEventListener('click', () => showItems(SHOW_MORE));
function showItems(count) {
items.splice(0, count).forEach(n => n.classList.add('ui-box-active'));
button.classList.toggle('ui-button-hidden', !items.length);
}
openItems.forEach(function (formItem) {
formItem.addEventListener('click', function () {
openBtn.innerText = this.innerText;
openList.classList.remove('open');
hiddenInput.value = this.dataset.value;
});
});openList.addEventListener('click', function(e) {
const item = e.target.closest('li.form-item');
if (item) {
openBtn.innerText = item.innerText;
openList.classList.remove('open');
hiddenInput.value = item.dataset.value;
}
});
const newData = data.map((n, i, a) => ({
...n,
newSick: n.sick - (i < ~-a.length && a[-~i].sick),
}));data.forEach((n, i, a) => n.newSick = n.sick - (a[i + 1]?.sick ?? 0));
// или
data.reduceRight((prev, n) => (n.newSick = n.sick - prev, n.sick), 0);
const sorted = (arr, key) => arr
.map(n => [ key(n), n ])
.sort(([a], [b]) => a < b ? -1 : +(a > b))
.map(n => n[1]);const sortedArr = sorted(arr, n => n[0].replace(/^\D+/, ''));const sortedArr = sorted(arr, n => {
const d = n[0].match(/\d+/g);
return +d[0] + +d.at(-1);
});
let count = 0;
const countEl = document.querySelector('.text');
const buttons = [...document.querySelectorAll('.click')];
const onClick = e => updateCount(e.target.classList.toggle('clicked') ? 1 : -1);
const updateCount = change => countEl.innerText = count += change;
buttons.forEach(n => n.addEventListener('click', onClick));
updateCount(buttons.reduce((acc, n) => acc + n.classList.contains('clicked'), 0));
- document.querySelector('.calculate').addEventListener('click', function () {
+ document.querySelector('form').addEventListener('input', function () {let select = document.querySelector('select').selectedIndex; let selectValue = select + 1; // selectedIndex считается с 0, поэтому +1
let dateStart = document.querySelector('.start_date').value; let dateEnd = document.querySelector('.end_date').value;
let out_3 = document.querySelector('.out_3');for (let i = dateStart; i <= dateEnd; i = i + 24 * 60 * 60 * 1000) {
document.querySelector('form').addEventListener('input', function() {
const { elements } = this;
const data = new FormData(this);
const keys = [ 'enterDate', 'outDate', 'countRooms', 'prepayment' ];
const basePayment = 2000;
const [ enter, out, rooms, prepayment ] = keys.map(k => data.get(k) /* или elements[k].value */);
const days = enter && out && enter < out
? (new Date(out) - new Date(enter)) / (24 * 60 * 60 * 1000)
: 0;
elements.payment.textContent = `${basePayment * days * rooms - prepayment} р`;
});
const result = Array.prototype.reduce.call(letter, (acc, n) => (
(n = soundParts[Number.isNaN(+n) ? 'letter' : 'number'][n]) && acc.push(n),
acc
), []);const result = Object
.entries(Object.assign({}, ...Object.values(soundParts)))
.reduce((acc, n) => (letter.includes(n[0]) && acc.push(n[1]), acc), []);
const result = arr.reduce((acc, n, i, a) => (
(i && n.name === a[~-i].name) || acc.push([]),
acc.at(-1).push(n),
acc
), []);function groupAdjacent(
data,
{
key = n => n,
newGroup = (c, p) => c !== p,
} = {}
) {
const getVal = key instanceof Function ? key : n => n[key];
return Array.prototype.reduce.call(
data,
(acc, n, i) => {
const v = getVal(n, i);
const iGroup = acc[0].length - (i && !newGroup(v, acc[1]));
(acc[0][iGroup] ??= []).push(n);
acc[1] = v;
return acc;
},
[ [], null ]
)[0];
}const result = groupAdjacent(arr, { newGroup: (c, p) => c.name !== p.name });
// или
const result = groupAdjacent(arr, { key: 'name' });
for (let i in goods) { if (discounts.length === 0) { count = goods[i].value * goods[i].amount; } for (let j in discounts) { if (goods[i].name === discounts[j].name) { count = (goods[i].value - goods[i].value * discounts[j].discount) * goods[i].amount; } else { count = goods[i].value * goods[i].amount; } } sum += count; console.log(count, goods[i].name); }
for (const n of goods) {
let s = n.value * n.amount;
for (const m of discounts) {
if (n.name === m.name) {
s *= 1 - m.discount;
break;
}
}
sum += s;
}Возможно есть лучший способ для решения такой задачи.
function totalCost(goods, discounts) {
discounts = Object.fromEntries(discounts.map(n => [ n.name, 1 - parseFloat(n.discount) / 100 ]));
return goods.reduce((acc, n) => acc + n.value * n.amount * (discounts[n.name] ?? 1), 0);
}
let letters = 'АаЕеIiOoUuYy' //Создал переменную со строкой с гласными
if (arg1[i] == letters[j]) { //Если элемент слова равен элементу строки с согласными newArr.push(arg1[i].indexOf()) //То пушу в массив индексы гласных этого слова }
.push(i).const getVowelsIndexes = str =>
Array.from(str.matchAll(/[aeiouy]/gi), n => n.index);const getVowelsIndexes = ((vowels, str) =>
Array.prototype.reduce.call(
str.toLowerCase(),
(acc, n, i) => (vowels.has(n) && acc.push(i), acc),
[]
)
).bind(null, new Set('aeiouy'));const getVowelsIndexes = str => Object
.entries(str)
.filter(n => 'AaEeIiOoUuYy'.includes(n[1]))
.map(n => +n[0]);const getVowelsIndexes = str =>
eval(`[${[...str]
.map((n, i) => /a|e|i|o|u|y/i.test(n) ? `${i},` : '')
.join('')
}]`);
const className = 'some-link';
const colors = {
En: 'red',
Ru: 'green',
De: 'blue',
};for (const n of document.getElementsByClassName(className)) {
n.style.setProperty('color', colors[n.textContent]);
}document.querySelectorAll(`.${className}`).forEach(function(n) {
n.style.color = this.find(m => m[0].test(n.innerText))?.[1];
}, Object.entries(colors).map(n => [ RegExp(n[0], 'i'), n[1] ]));- RegExp(n[0], 'i')
+ n[0].toLowerCase()- m[0].test(n.innerText)
+ n.innerText.toLowerCase().includes(m[0])
const newData = data.reduce((acc, n) => {
const k = Object.keys(n)[0];
(acc.result[acc.keys[k] = (acc.keys[k] ?? -1) + 1] ??= []).push(n);
return acc;
}, { result: [], keys: {} }).result.flat();const numKeys = new Set(data.flatMap(Object.keys)).size;
const numObjs = data.length / numKeys;
const newData = data.map((n, i, a) => a[(i % numKeys) * numObjs + (i / numKeys | 0)]);
(function toArrays(obj) {
const arr = Object.values(obj ?? {});
arr.forEach(n => n.children = toArrays(n.children));
return arr;
})(arr.reduce((acc, n) => {
const keys = n.path.replace(/^\/|\/$/g, '').split('/');
const obj = keys.reduce((p, c) => (p.children ??= {})[c] ??= {}, acc);
Object.assign(obj, n);
return acc;
}, {}).children)