Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивная функция, Обход объектов 
V
    Опции темы
JAYBE
Дата 22.9.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Добрый день!
Имеются массив объеков вида:
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);
}
}
}

Но витоге при обходе функция уходит вглубь первого элемента.
Тоесть как только в обхекте есть элемент, она идёт по нему, но следующий родительский уже не выводит.
PM   Вверх
нуп
Дата 22.9.2011, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: 12
Всего: 33



Код

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. Скорей всего из-за неё и неработало
PM MAIL   Вверх
JAYBE
Дата 22.9.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Большое спасибо  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?
PM   Вверх
нуп
Дата 22.9.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: 12
Всего: 33



Приведите пример с массивом
PM MAIL   Вверх
JAYBE
Дата 22.9.2011, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Вот код:
Код

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?

Это сообщение отредактировал(а) JAYBE - 22.9.2011, 16:47
PM   Вверх
нуп
Дата 22.9.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: 12
Всего: 33



Проверить на существование массива child  smile  if(elem.child) { ... }
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.