Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Рекурсивная функция


Автор: JAYBE 22.9.2011, 10:17
Добрый день!
Имеются массив объеков вида:
Obj1.name
Obj1.child[Obj1: name, child[]}, Obj2{name, child[]}]
Obj2.name
Obj2.child[]
Подскажите, как обойти массив, проходя по каждому элементу и выводя name?
Тоесть должно быть так:
Obj1.name
 Obj1.child.Obj1.name
 Obj1.child.Obj2.name
Obj2.name

Код

function readObj (mass) {
for (i = 0; i < mass.length; i ++) {
alert(i.name)
if ((mass[i].HasProperty('child')) && (ArrayCount(mass[i].child)>0)) {
readObj (mass[i].child);
}
}
}

Но витоге при обходе функция уходит вглубь первого элемента.
Тоесть как только в обхекте есть элемент, она идёт по нему, но следующий родительский уже не выводит.

Автор: нуп 22.9.2011, 10:35
Код

var data = [
    { name : 'name1', child : [ { name : 'name11', child : [] }, { name : 'name2', child : []} ] },
    { name : 'name2', child : [] },
    {name : 'name3', child : [ {name : 'nam31', child : []} ] }
];

function recursive(elem) {
    var i;
    console.log(elem.name);
    for(i = 0; i < elem.child.length; i += 1) {
        recursive(elem.child[i]);
    }
}

//вызов
var i;
    for(i = 0; i < data.length; i += 1) {
        recursive(data[i]);
    }

Самое главное это определение локальной переменной в функции  через var. Скорей всего из-за неё и неработало

Автор: JAYBE 22.9.2011, 14:20
Большое спасибо  smile 
Я создаю дерево файлов и папок. Папки имеют свойство child, а файлы нет.
Если рекурсия натыкается на файл, то дальше не обходит
.
Код

var data = [
    { name : 'name1', child : [ { name : 'name11', child : [] }, { name : 'name2', child : []} ] },
    { name : 'name2'},
    {name : 'name3', child : [ {name : 'nam31', child : []} ] }
];



Т.е. при вышеперчисленных оъектах обход заканчивается на переменной data[1], она же name2.
Можно это как-то исправить без добавления файлам свойства child?

Автор: нуп 22.9.2011, 14:23
Приведите пример с массивом

Автор: JAYBE 22.9.2011, 16:46
Вот код:
Код

var data = [
    { name : 'name1', child : [ { name : 'name11', child : [] }, { name : 'name2', child : []} ] },
    { name : 'name2'},
    {name : 'name3', child : [ {name : 'nam31', child : []} ] }
];

function recursive(elem) {
    var y;
    for(y = 0; y < elem.child.length; y += 1) {
        recursive(elem.child[y]);
    }
}

//вызов
var i;
    for(i = 0; i < data.length; i += 1) {
        recursive(data[i]);
    }

Обращаю внимание на строку 3: <<{ name : 'name2'},>>
Результатов будет вывод:
    name1
    name11
    name12
    name2
Как можно исправить ситуацию без добавления ко 2-ому элемента свойства child?

Автор: нуп 22.9.2011, 17:21
Проверить на существование массива child  smile  if(elem.child) { ... }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)