const duplicates = Array
.from(arr.reduce((acc, n) => acc.set(n.id, acc.has(n.id)), new Map))
.reduce((acc, n) => (n[1] && acc.push(n[0]), acc), []);
// или
const duplicates = arr.reduce((acc, { id }) => (
(acc[1][id] = -~acc[1][id]) === 2 && acc[0].push(id),
acc
), [ [], {} ])[0];
// или
const duplicates = [...arr
.reduce((acc, n) => (acc[+acc[0].has(n.id)].add(n.id), acc), [ new Set, new Set ])
.pop()
];
// или
const duplicates = arr
.map(n => n.id)
.filter((n, i, a) => i !== a.indexOf(n))
.filter((n, i, a) => i === a.indexOf(n));
// или
const duplicates = arr.reduce((acc, { id: n }, i, a) => (
!acc.includes(n) && i !== a.findIndex(m => m.id === n) && acc.push(n),
acc
), []);
.active
background-color: #77b97e
color: #fff
&:hover
background-color: #99db8f
document.addEventListener('click', ({ target: { classList: cl } }) =>
cl.contains('calendar__mounth-day') && cl.toggle('active')
);
id
у чекбоксов и for
у label'ов такими, чтобы клик по label'у переключал состояние чекбокса. Т.е., одинаковыми для пары из чекбокса и соответствующего ему label'а, уникальными для каждой из пар..calendar__mounth-list input:checked + label
background-color: #77b97e
color: #fff
&:hover
background-color: #99db8f
$('.slider').slider('values', [ thisfrom, thisto ]);
const colors = [ 'red', 'orange', 'yellow', 'green', 'aqua', 'blue', 'magenta' ];
let index = -1;
+ 1
и меняете цвет background'а:hoverEl.addEventListener('mouseenter', () => {
index = (index + 1) % colors.length;
colorEl.style.backgroundColor = colors[index];
});
const data = Array
.from(document.querySelectorAll('.js-input input'))
.reduce((acc, n) => {
const keys = n.name.match(/(?<=\[)\w+(?=\])/g);
const key = keys.pop();
keys.reduce((p, c) => p[c] = p[c] || {}, acc)[key] = n.value;
return acc;
}, {});
т.к. объектов много (~2000) при очистке фильтра страница подлагивает
const videos = document.querySelectorAll('video');
const onPlay = e => videos.forEach(n => n !== e.target && n.pause());
videos.forEach(n => n.addEventListener('play', onPlay));
const $elements = $('здесь селектор ваших элементов');
const updateElement = i => $elements.eq(i).addClass('здесь ваш класс');
const delay = 500;
$elements.each(i => setTimeout(updateElement, (i + 1) * delay, i));
(function next(i) {
if (i < $elements.length) {
setTimeout(() => {
updateElement(i);
next(-~i);
}, delay);
}
})(0);
const intervalID = setInterval(
i => updateElement(++i[0]).length || clearInterval(intervalID),
delay,
[ -1 ]
);
const str = arr
.map(n => `${n.charAt(0).toUpperCase()}${n.slice(1)}`)
.join(', ');
// или
const str = arr.reduce((acc, n, i) => {
return acc + (i ? ', ' : '') + n.replace(/./, m => m.toUpperCase());
}, '');
// или
const str = ''.concat(...arr.flatMap(([ c = '', ...n ], i) => {
return [ i ? ', ' : '', c.toUpperCase(), ...n ];
}));
есть массив индексов[0, 3, 1, empty, 2]
<...>
должно быть -[100, 400, 200, empty, 300]
for (let i = 0; i < indexes.length; i++) {
if (indexes.hasOwnProperty(i)) {
arr.push(arr[indexes[i]]);
} else {
arr.length++;
}
}
arr.splice(0, arr.length - indexes.length);
arr.splice(0, arr.length, ...indexes.map(i => arr[i]));
const className = 'carusel__item_active';
.const hasClass = el => el.classList.contains(className);
// или
const hasClass = el => el.matches(`.${className}`);
// или
const hasClass = el => el.className.split(' ').includes(className);
// или
const hasClass = el => RegExp(`(^| )${className}( |$)`).test(el.classList.value);
const activeSlide = Array.prototype.find.call(items, hasClass);
// или
let activeSlide = null;
for (const n of items) {
if (hasClass(n)) {
activeSlide = n;
break;
}
}
// или
const [ activeSlide ] = [...items].filter(hasClass);
// или
let activeSlide = null;
for (let i = 0; i < items.length && !activeSlide; i++) {
activeSlide = hasClass(items[i]) ? items[i] : activeSlide;
}
// или
let activeSlide = items[0];
while (activeSlide && !hasClass(activeSlide)) {
activeSlide = activeSlide.nextElementSibling;
}
// или
const activeSlide = (function get(i, n = items.item(i)) {
return (!n || hasClass(n)) ? n : get(-~i);
})(0);
function onMarkerClick(e) {
map.setZoom(8);
map.panTo(e.latLng);
}
for (const f of features) {
const marker = new google.maps.Marker({
position: f.position,
icon: icons[f.type].icon,
map,
});
marker.addListener('click', onMarkerClick);
}
const input = document.querySelector('input');
const buttons = document.querySelectorAll('button');
buttons.forEach(n => n.addEventListener('click', onClick));
const classes = [
[ 'id1', 'class1' ],
[ 'id2', 'class2' ],
[ 'id3', 'class3' ],
];
function onClick() {
classes.forEach(n => input.classList.toggle(n[1], n[0] === this.id));
}
<button data-class="class1">click me</button>
<button data-class="class2">click me</button>
<button data-class="class3">click me</button>
function onClick() {
buttons.forEach(n => input.classList.toggle(n.dataset.class, n === this));
}
const count = (max, timeout) => (function next(i) {
if (i <= max) {
setTimeout(() => {
console.log(i);
next(++i);
}, timeout(i));
}
})(0);
count(100, i => i * 5);
function debounce(f, delay) {
let timeoutId = null;
return function() {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => f.apply(this, arguments), delay);
};
}
function throttle(f, delay) {
let lastCall = -Infinity;
return function() {
const now = +new Date;
if (now - lastCall > delay) {
lastCall = now;
return f.apply(this, arguments);
}
};
}