Рекурсия, конечно же. Функция принимает
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);
}
}