const itemSelector = '.item';
const activeClass = 'active';
const maxActive = 3;
const onMaxActiveClick = () => alert(`больше ${maxActive} нельзя`);
// делегирование, назначаем обработчик клика один раз для всех элементов
document.addEventListener('click', function(e) {
const item = e.target.closest(itemSelector);
if (item) {
const active = document.querySelectorAll(`${itemSelector}.${activeClass}`);
if (active.length < maxActive || item.classList.contains(activeClass)) {
item.classList.toggle(activeClass);
} else {
onMaxActiveClick();
}
}
});
// или, назначаем обработчик клика каждому элементу индивидуально
let activeCount = 0;
for (const n of document.querySelectorAll(itemSelector)) {
n.addEventListener('click', onClick);
activeCount += n.classList.contains(activeClass);
}
function onClick({ currentTarget: item }) {
if (activeCount < maxActive || item.classList.contains(activeClass)) {
activeCount += item.classList.toggle(activeClass) ? 1 : -1;
} else {
onMaxActiveClick();
}
}
const getCheckedValues = elements =>
[...elements].reduce((acc, n) => (
n.checked && (acc[n.name] = acc[n.name] || []).push(n.value),
acc
), {});
const getCheckedValues = elements =>
Array.prototype.reduce.call(
elements,
(acc, { name, value, checked }) => (
acc[name] = acc[name] || [],
checked && acc[name].push(value),
acc
),
{}
);
Получается, что объявляем две переменных <...> То есть это равносильно
Что не так делаю?
let uploadTo = null;
$('.file-upload-preview').click(function() {
uploadTo = this;
$('#file-upload').click();
});
$(".file-upload-preview")
на $(uploadTo)
. const inputSelector = '.hidden_field';
const itemSelector = '.item';
const activeClass = 'active';
// как это может выглядеть с использованием jquery
const $items = $(itemSelector).click(function() {
$(this).toggleClass(activeClass);
$(inputSelector).val($items
.filter(`.${activeClass}`)
.get()
.map(n => $(n).text())
.join(', ')
);
});
// или, к чёрту jquery
const items = [...document.querySelectorAll(itemSelector)];
items.forEach(n => n.addEventListener('click', onClick));
function onClick() {
this.classList.toggle(activeClass);
document.querySelector(inputSelector).value = items
.filter(n => n.classList.contains(activeClass))
.map(n => n.innerText)
.join(', ');
}
const result = Object.entries(commonObj).map(([ k, v ]) => ({
objDataName: (objectData.find(n => n.key === k) || {}).name || null,
packageName: (packageData.find(n => n.id === v.package_id) || {}).title || null,
}));
const arrToObj = (arr, key, val) =>
arr.reduce((acc, n) => (acc[n[key]] = n[val], acc), {});
const objects = arrToObj(objectData, 'key', 'name');
const packages = arrToObj(packageData, 'id', 'title');
const result = Object.entries(commonObj).map(n => ({
objDataName: objects[n[0]] || null,
packageName: packages[n[1].package_id] || null,
}));
for (let i = 0; i < 6; i++) {
const count = res.data.filter(n => +n.categoryid === i).length;
$(`#category_count_${i}`).html(`(${count})`);
}
const checkItem = item => item.categoryid === '3';
const count = response.data.filter(checkItem).length;
// или
const count = response.data.reduce((acc, n) => acc + checkItem(n), 0);
// или
let count = 0;
for (const n of response.data) {
count += checkItem(n);
}
// или
const count = eval(response.data.map(checkItem).join('+')) || 0;
checked
не приводит к возникновению события change
, так что его следует создавать самостоятельно - добавьте .trigger('change')
после вызова prop
. const getChunks = (arr, chunkSize) =>
Array.from(
{ length: Math.ceil(arr.length / chunkSize) },
(n, i) => arr.slice(i * chunkSize, (i + 1) * chunkSize)
);
// или
const getChunks = (arr, chunkSize) =>
arr.reduce((acc, n, i) => (
i = i / chunkSize | 0,
(acc[i] = acc[i] || []).push(n),
acc
), []);
// или
const getChunks = (arr, chunkSize) =>
arr.reduce((acc, n, i) => (
(i % chunkSize) || acc.push([]),
acc[acc.length - 1].push(n),
acc
), []);
const arr = [...Array(50).keys()];
const chunks = getChunks(arr, 7);
const links = document.querySelectorAll('a');
// или
const links = document.getElementsByTagName('a');
const getHref = el => el.getAttribute('href');
// или
const getHref = el => el.attributes.href.value;
const hrefs = Array.from(links, getHref);
// или
const hrefs = Array.prototype.map.call(links, getHref);
// или
const hrefs = [];
for (const n of links) {
hrefs.push(getHref(n));
}
// или
const hrefs = [];
for (let i = 0; i < links.length; i++) {
hrefs[i] = getHref(links[i]);
}
// или
const hrefs = (function get(i) {
return links[i] ? [ getHref(links[i]), ...get(i + 1) ] : [];
})(0);
Ведь у пустого массива есть численное представление: +[] вернет 0.
false+[]
нет преобразования массива в число. Есть сложение - массив преобразовывается в строку, false тоже. Если интересуют детали - можете ознакомится со спецификацией.