const group = (arr, key) =>
arr.reduce((acc, n) => {
const k = n[key];
(acc[k] = acc[k] || []).push(n);
return acc;
}, {});
const result = Object.values(group(array, 'prop'));
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 grouped = {};
for (const n of data) {
(grouped[getKey(n)] ??= []).push(getVal(n));
}
return grouped;
}
const groupedBySign = group([ 0, 1, 2, 3, -10, -20, -30, 0 ], Math.sign);
const groupedByParity = group(Array(10).keys(), n => [ 'чётные', 'нечётные' ][n & 1]);
const chars = group(
'ABC123?!+',
n =>
n.toLowerCase() !== n.toUpperCase() ? 'буква' :
Number.isInteger(+n) ? 'цифра' :
'другое'
);
<input name="xxx" value="69">
<input name="xxx" value="187">
<input name="xxx" value="666">
<input name="yyy" value="0">
const values = group(document.querySelectorAll('input'), 'name', 'value');
const result = Object.values(Object.groupBy(array, n => n.prop));
<div class="block">hello, world!!</div>
<div class="block">fuck the world</div>
<div class="block">fuck everything</div>
<button>click me</button>
.block {
display: none;
}
const $btn = $('button').click(function() {
$btn.hide();
$('.block').get().reduceRight((onComplete, el) => {
return () => $(el).fadeIn(300).delay(1000).fadeOut(300, onComplete);
}, () => $btn.show())();
});
Проблема в том, что код <...> не удаляет класс
.js-contacts-form
добавляет класс обратно. Останавливайте всплытие в обработчике клика по .detail-work__close
; или проверяйте перед добавлением класса, где был клик и не добавляйте класс, если... ну, думаю понятно. выполняются одновременно
new Promise
, чтобы получить желаемую асинхронность. Проведите небольшой эксперимент - откройте консоль, выполнитеconsole.log('щас будем создавать промис');
new Promise(r => {
console.log('создаём промис');
setTimeout(() => {
console.log('так, сейчас дёрнем резолв');
r();
console.log('резолв дёрнули');
});
}).then(() => console.log('зарезолвились, наконец-то'));
console.log('промис создан');
const $block = $('.picture__text');
const text = $block.text();
const itemSelector = '.pictures__another';
$(document).on('mouseover mouseout', itemSelector, function(e) {
$block.text(e.type === 'mouseout' ? text : $(this).text());
});
// или
$(itemSelector).hover(
e => $block.text($(e.currentTarget).text()),
() => $block.text(text)
);
Скорее всего я где-то не обнулил интервал или таймаут.
document.addEventListener('focus', function(e) {
if (e.target.tagName === 'INPUT') {
// здесь ваш код
}
}, true);
const getLeapYears = (start, end) => Array
.from({ length: end - start + 1 }, (n, i) => start + i)
.filter(n => ((n % 100) && !(n % 4)) || !(n % 400));
console.log(getLeapYears(1888, 2099));
function* getLeapYears(start, end) {
for (let i = Math.ceil(start / 4) * 4; i <= end; i += 4) {
if ((i % 100) || !(i % 400)) {
yield i;
}
}
}
console.log(...getLeapYears(1888, 2099));
const containerSelector = '.choose-buttons';
const buttonSelector = '.btn';
const activeClass = 'active';
const maxActive = 3;
$(containerSelector).on('click', buttonSelector, function(e) {
const numActive = $(`${buttonSelector}.${activeClass}`, e.delegateTarget).length;
const $this = $(this);
if (numActive < maxActive || $this.hasClass(activeClass)) {
$this.toggleClass(activeClass);
}
});
// или
document.querySelectorAll(containerSelector).forEach(n => {
n.addEventListener('click', onClick);
});
function onClick(e) {
const button = e.target.closest(buttonSelector);
if (button) {
const active = [...this.querySelectorAll(`${buttonSelector}.${activeClass}`)];
if (active.length < maxActive || active.includes(button)) {
button.classList.toggle(activeClass);
}
}
}
событие не срабатывает
const oldSetDate = $.datepicker._setDate;
$.datepicker._setDate = function(...args) {
oldSetDate.apply(this, args);
setTimeout(() => args[0].input.find('.ui-datepicker-current-day').click());
};
p.process-block__stage-number.active I
p.process-block__stage-number II
p.process-block__stage-number III
p.process-block__stage-number IV
button.process-block__btn(data-change=-1)
span
b prev
button.process-block__btn(data-change=+1)
span
b next
document.addEventListener('click', function(e) {
const button = e.target.closest('[data-change]');
if (button) {
const blocks = [...document.querySelectorAll('.process-block__stage-number')];
let active = blocks.findIndex(n => n.classList.contains('active'));
blocks[active].classList.remove('active');
active = Math.max(0, Math.min(blocks.length - 1, active + +button.dataset.change));
blocks[active].classList.add('active');
}
});
проблема в том, что при клике по какому-либо элементу подМЕНЮ, первый, элемент который задавался по умолчанию не сбрасывает стиль
$('ul#topnav li span a').click(function(e) {
e.stopPropagation();
...
const [ key ] = Object
.entries(data)
.reduce((max, [ k, { Number_of_Something: v } ]) => {
return max[1] > v ? max : [ k, v ];
}, [ null, -Infinity ]);
const key = (Object
.entries(data)
.sort((a, b) => b[1].Number_of_Something - a[1].Number_of_Something)
.shift() || [ null ])
.shift();
let key = null;
let max = -Infinity;
for (const k in data) {
if (data.hasOwnProperty(k) && data[k].Number_of_Something > max) {
key = k;
max = data[k].Number_of_Something;
}
}
const max = Math.max(...Object.values(data).map(n => n.Number_of_Something));
const key = Object.keys(data).find(k => data[k].Number_of_Something === max) || null;
<div class="out"></div>
<button class="btn">click me</button>
const images = [ '...', '...', /* ... */ ];
const SHOW_MORE = 2;
document.querySelector('.btn').addEventListener('click', e => {
document.querySelector('.out').insertAdjacentHTML('beforeend', images
.splice(0, SHOW_MORE)
.map(n => `<div class="outImg"><img src="${n}"></div>`)
.join('')
);
e.target.disabled = !images.length;
});
$('ur_login')
$('ur_password')
только начал учить AJAX и PDO