ul
и текущий уровень. Берутся все элементы до следующего с текущим уровнем, оборачиваются в ul
, затем следует рекурсивный вызов: свежесозданный ul
, текущий уровень + 1.ul
содержит дочерние ul
:function wrap(ul, level = 0) {
const
currLevel = `.level-${level}`,
nextLevel = `.level-${level + 1}:first`;
let $li = null;
while (($li = $(ul).children(nextLevel)).length) {
const $ul = $('<ul></ul>');
$ul.append($li.nextUntil(currLevel).addBack().last().after($ul).end());
wrap($ul, level + 1);
}
}
ul
в li
текущего уровня, находящиеся перед элементами следующего уровня:function wrap(ul, level = 0) {
const
currLevel = `.level-${level}`,
nextLevel = `.level-${level + 1}:first`;
let $li = null;
while (($li = $(ul).children(nextLevel)).length) {
const $ul = $('<ul></ul>');
$li.prev().append($ul);
$ul.append($li.nextUntil(currLevel).addBack());
wrap($ul, level + 1);
}
}
for (let i = arr.length; i--;) {
const exists = arr.hasOwnProperty(i);
if (exists || !i) {
arr.length = i + exists;
break;
}
}
for (let i = arr.length; i-- && !(i in arr); arr.pop()) ;
str = str[0].toUpperCase() + str.slice(1);
// или
str = str.replace(/^./, m => m.toUpperCase());
// или
str = Array.from(str, (n, i) => i ? n : n.toUpperCase()).join('');
const names = [ 'DIV', 'P', 'SPAN', ... ];
if (names.includes(el.nextSibling.nodeName)) {
...
-1
- добавить значение в массив, в противном случае - удалить:const active = [];
document.addEventListener('click', ({ target: t }) => {
const value = t.dataset['data-атрибут'];
if (value) {
const index = active.indexOf(value);
if (index === -1) {
active.push(value);
} else {
active.splice(index, 1);
}
}
});
document.addEventListener('click', ({ target: t }) => {
if (t.dataset['data-атрибут']) {
t.classList.toggle('active');
}
});
const active = Array
.from(document.querySelectorAll('.active'), n => n.dataset['data-атрибут'])
.join(', ');
const sourceKey = 'population';
const sourceVal = 2870528;
const targetKey = 'name';
const [ val ] = jp.query(cities, `$[?(@.${sourceKey} == ${sourceVal})].${targetKey}`);
const val = (cities.find(n => n[sourceKey] === sourceVal) || {})[targetKey];
'use strict';
Может кто то знает как решить эту проблему?
document.addEventListener('change', function(e) {
if (e.target.type === 'radio') {
e.target.closest('form').querySelector('.output').textContent = e.target.value;
}
});
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 = Object
.entries(arr.reduce((acc, n) => (acc[n.id] = (acc[n.id] || 0) + 1, acc), {}))
.filter(n => n[1] > 1)
.map(n => +n[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
), []);
$('.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) при очистке фильтра страница подлагивает