Рекурсивно обхождане на масив с обекти и в тях още масиви и обекти


3

Имам следния масив:

var data = [
           { label: 'Ordered Item 1' },
           {
               label: 'Ordered Item 2',
               list: [
                  { label: 'Ordered Sub Item 2.1' },
                  { label: 'Ordered Sub Item 2.2' },
                  { label: 'Ordered Sub Item 2.3' }
               ]
           },
           {
               label: 'Ordered Item 3',
               list: {
                   1: {
                       label: 'Unordered Sub Item 3.1',
                       list: {
                           1: { label: 'Unordered Sub Item 3.1.1' },
                           2: { label: 'Unordered Sub Item 3.1.2' }
                       }
                   },
                   2: { label: 'Sub Item 3.2' },
                   3: {
                       label: 'Sub Item 3.3',
                       list: [
                          { label: 'Ordered Sub Item 3.3.1' },
                          { label: 'Ordered Sub Item 3.3.2' },
                          { label: 'Ordered Sub Item 3.3.3' }
                       ]
                   }
               }
           }
        ];
 

Искам да го обохяд рекурсивно и да изпечатам следното на браузърската конзола (булетите не са важни, може да се заменят с числа):

Идентацията искам да е спазена на конзолата, за да се вижда че едните неща са вложени в другите. Обаче не ми се получават нещата, прерових и Гугъл и вече се отчаях :(

За обикновен масив от обекти намерих решение, просто минавам с един for in, обаче с толкова заплетена структура само и единствено рекурсията помага, обачеее... Изчетох какво ли не, не става и не става... Някой ако се е сблъсквал с такъв проблем, ще съм му благодарен даде някакви насоки!

Между другото докато търсих тук в stackoverflow се натъкнах на един много полезен пост по темата, споделям ви го.




Отговори



2

Здравей, тъкмо вчера решавах задачата от тема ООП от миналия курс JavaScript 2, в която имаме обект от тип Vehicle, който има поле, което е обект от тип PropulsionUnit, или е масив от няколко PropulsionUnit обекта. PropulsionUnit сам по себе си също има пък други полета, при което се получава същата вложена структура.

Направих си следната >>функция<<, с която да мога да отпечатам обекта Vehicle на конзолата със съответно изместване identation, което можеш да си промениш както ти харесва в твоя случай. Идеята е, че за всеки обект, ако е примитивен, го печаташ, а ако не е, рекурсивно викаш функцията за всичките му полета. Ако текущото поле е примитивно, го печаташ, ако е обект, викаш рекурсивно за него и т.н. Мисля, че това горе-долу ще ти свърши работа, евентуално с някакви доизкусурявания за твоя случай.

:)


от varbanoff (2325 точки)


2

Здравей,

Ако структората ти отгоре е винаги дефинирана както си я показал, решението е сравнително лесно: http://jsbin.com/jugicawe/2/edit. Ако искаш обаче да добавяш и други неща, малко се усложнява... Трябва да се правят доста проверки

Поздрави,

Дончо Минков


от DonchoMinkov (12706 точки)


0
Структурата не е статична, а динамична.. Днес данните са едни, утре други...Затова си трябва и рекурсията, амаа...верно явно е бая сложничко... :(

от Matrix (2857 точки)

0
е, ако пропъртитата винаги се казват "list" и "label" нямаш проблем. Ако се казват по друг начин, трябва да пратиш проверка за пропърти на обекта, което е instanceof Array и да foreach-ваш по него...

от DonchoMinkov (12706 точки)