2014-11-15 1 views
0

Хорошие люди, объясните мне, пожалуйста, работу этой функции:рекурсии в функции создания дерева DOM

function createTreeDom(obj) { 
    if (isObjectEmpty(obj)) return; 

    var ul = document.createElement('ul'); 

    for (var key in obj) { 
    var li = document.createElement('li'); 
    li.innerHTML = key; 

    var childrenUl = createTreeDom(obj[key]); 
    if (childrenUl) li.appendChild(childrenUl); 

    ul.appendChild(li); 
    } 

    return ul; 
} 

Вот ссылка на песочнице, это полный код: http://jsbin.com/zonoxereqa/1/edit

Как вот эти функции очень хорошо понимал:

function isObjectEmpty(obj) { 
    for (var key in obj) { 
    return false; 
    } 
    return true; 
} 

function createTree(container, obj) { 
    container.appendChild(createTreeDom(obj)); 
} 

только createTreeDom(obj) рекурсивных функций я не очень понимаю ее работы, пожалуйста, помоги мне объяснить свою работу.

Я все еще не понимаю, что назначено переменной childrenUl? Почему он всегда в отладчике не определен?

+0

@AlienWebguy, извините, но у меня есть целый день, пытаясь выяснить эту функцию, просто петля рекурсии стучит меня. – Aleksandr

+1

Эй, ребята, я бы не так быстро проголосовал за закрытие: рекурсия может быть нелегко понять для кого-то. Александр, я рекомендую изменить заголовок на что-то более конкретное, например * Рекурсия в функции, создающей дерево DOM * –

+0

Если ваш вопрос будет закрыт, я рекомендую точно указать, какую часть вы не понимаете. И вместо *, пожалуйста, помогите мне * сформулировать какой-то конкретный вопрос, используя знак вопроса: два парня проголосовали «непонятно, что вы просите» только потому, что они не видят знак вопроса. –

ответ

2

Создает вложенные списки, используя вложенные объекты. На одном уровне вложенности он создает один простой список 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; 
} 
+0

Спасибо за ответ! Я понимаю, что эта функция, я просто хочу понять ее работу. Я запутываю цикл рекурсии. – Aleksandr

+0

Я также использовал отладчик, но не полностью понял. Но я все еще новичок в программировании. Я бы хотел, чтобы это помогло мне понять. – Aleksandr

+1

Я пытался объяснить это шаг за шагом. Теперь ясно, или есть еще какая-то сложная часть? –

Смежные вопросы