const sorted = (arr, key) => arr
.map(n => [ n, key(n) ])
.sort((a, b) => a[1] - b[1])
.map(n => n[0]);// если элементы с отсутствующим номером квартиры должны оказаться
// в начале, а не в конце, то вместо Infinity надо поставить 0
const sortedArr = sorted(
arr,
n => +(n.address.match(/кв.\s*(\d+)/) || [ Infinity ]).pop()
);
$numArr = count($array);
$numElems = count($array[0]);
$combinations = [];
$numCombinations = pow($numElems, $numArr);
for ($i = 0; $i < $numCombinations; $i++) {
$combination = [];
for ($j = 0; $j < $numArr; $j++) {
$arrIndex = $j;
$elIndex = $i / pow($numElems, $j) % $numElems;
$combination[] = $array[$arrIndex][$elIndex];
}
$combinations[] = $combination;
}
url имеет значение null:await axios.get(url)state.url является null:await axios.get(state.url)null берётся. Второй вариант, со стейтом. В мутации getFullArticle (кстати, почему get? - вы тут данные не запрашиваете, а кладёте в стейт, правильнее было бы set) помимо прочего выполняется соответствующее присваивание:state.url = article.previousprevious сидит null.state.url. Во-вторых, вообще не давать пользователю возможности запрашивать данные, если state.url кривой. Для этого в компоненте сделайте вычисляемое свойство, которое в зависимости от корректности state.url будет принимать значение true или false, и пусть это свойство отвечает за отключение кнопки или сокрытие ссылки или как там у вас организован запрос новых данных.
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.charAt(0).toUpperCase() + str.slice(1);
// или
str = str.replace(/^./, m => m.toUpperCase());
// или
str = Array.from(str, (n, i) => i ? n : n.toUpperCase()).join('');
// или
str = (([ c = '', ...str ]) => c.toUpperCase().concat(...str))(str);
.main-footer__box:has(input:focus) label {
color: red;
}
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(', ');
key с элементов .d_day и .li_day. Элементам .d_day добавить общую обёртку, ей в качестве key указать currentPage. Заменить transition-group на transition.