Создает вложенные списки, используя вложенные объекты. На одном уровне вложенности он создает один простой список ul li, li ...
. Но если какое-то значение не пустой объект, как этот
var arg = { "one":{}, "two":{}, "three":{"subone":{}, "subtwo":{}}, "four":{}};
то субобъект присоединяемый как подсписок в рекурсии
var childrenUl = createTreeDom(obj[key]);
if (childrenUl) li.appendChild(childrenUl);
Если значение не является пустым объектом, не Подсписок не создаются, так как есть условие останова в качестве первой команды:
if (isObjectEmpty(obj)) return;
шаг за шагом для вышеупомянутого массива: для первого элемента, функция создает ul
элемент и добавляет li
в него, с key="one"
и obj[key]={}
:
<ul>
<li>one</li>
</ul>
Но это еще не сделано, теперь рекурсия называется: createTreeDom({})
. Поскольку isObjectEmpty({})
(очевидно) возвращает true, концы рекурсии и childrenUl
не определены. Поэтому, не содержание не добавляется в li
и цикл переходит на второй узел, который также является только простой строковый литерал, поэтому он добавляет еще один li
узел:
<ul>
<li>one</li>
<li>two</li>
</ul>
Теперь пункт: третий аргумент. Перед тем, выполнение переходит к рекурсии, это выглядит следующим образом:
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
Но значение третьего элемента не является пустым объектом, поэтому команда
if (childrenUl) li.appendChild(childrenUl);
создает ul
узел, наполненный его содержание шаг за шагом, как и выше, и добавляет его к li
элемента:
<ul>
<li>one</li>
<li>two</li>
<li>three
<ul>
<li>subone</li>
<li>subtwo</li>
</ul>
</li>
</ul>
Если какой-либо из вложенных элементов содержит другой непустой объект, он будет добавлен в качестве вспомогательного списка к некоторому под-списку li
и так далее.
Там может быть лучше читать эквивалент:
function createTreeDom(obj) {
var ul = document.createElement('ul');
for (var key in obj) {
var li = document.createElement('li');
li.innerHTML = key;
if (!isObjectEmpty(obj[key])) {
var childrenUl = createTreeDom(obj[key]);
li.appendChild(childrenUl);
}
ul.appendChild(li);
}
return ul;
}
@AlienWebguy, извините, но у меня есть целый день, пытаясь выяснить эту функцию, просто петля рекурсии стучит меня. – Aleksandr
Эй, ребята, я бы не так быстро проголосовал за закрытие: рекурсия может быть нелегко понять для кого-то. Александр, я рекомендую изменить заголовок на что-то более конкретное, например * Рекурсия в функции, создающей дерево DOM * –
Если ваш вопрос будет закрыт, я рекомендую точно указать, какую часть вы не понимаете. И вместо *, пожалуйста, помогите мне * сформулировать какой-то конкретный вопрос, используя знак вопроса: два парня проголосовали «непонятно, что вы просите» только потому, что они не видят знак вопроса. –