Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разобрать объект - поле -> div (или ul) (https://javascript.ru/forum/misc/65108-razobrat-obekt-pole-div-ili-ul.html)

Sherminator 26.09.2016 18:50

Разобрать объект - поле -> div (или ul)
 
Есть большой объект, например

var user = {
  name: "Вася",
  age: 25,
  size: {
    top: 90,
    middle: 60,
    bottom: 90,
      size: {
         top: 90,
         middle: 60,
         bottom: 90,
            size: {
               top: 90,
               middle: 60,
               bottom: 90
                    }
              }
        }
}



Как пробежаться по всем полям так, чтобы на выходе получилось

<div>
    <div>name: "Вася"</div>
    <div>age: 25</div>
    <div>size:
        <div>top: 90</div>
        <div>middle: 60</div>
        <div>bottom: 90</div>
        <div>size:
            <div>top: 90</div>
            <div>middle: 60</div>
            <div>bottom: 90</div>
            <div>size:
                <div>top: 90</div>
                <div>middle: 60</div>
                <div>bottom: 90</div>
            </div>
        </div>
    </div>
</div>


Набросал код, но он возвращает последнее вложение объекта. В чем косяк?
Fx.Wrap = function (obj) {
    var out = "";
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] != undefined) {
            if (typeof obj[prop] == 'object') {
                out += this.Wrap(obj[prop]);
                continue;
            }
            out += '<div>' + prop + ': ' + obj[prop] + '</div>';
        }
    }
    return out;
};

warren buffet 26.09.2016 18:53

Тут нужна рекурсия. Нужен специалист, или жди когда я дотямаю.

UPD. Fx.Wrap === this.Wrap ? То есть это она и есть, рекурсия?

Sherminator 26.09.2016 19:00

Цитата:

Сообщение от warren buffet (Сообщение 429954)
Fx.Wrap === this.Wrap ? То есть это она и есть, рекурсия?

Теоретически да) Но что то не получается она

рони 26.09.2016 19:09

Sherminator,
Fx.Wrap = function (obj) {
    var out = "";
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] != undefined) {
            var k = obj[prop];
            if (typeof k == 'object') {
                k = this.Wrap(k);
            }
            out += '<div>' + prop + ': ' + k + '</div>';
        }
    }
    return out;
};

Sherminator 26.09.2016 19:31

рони, вы всего лишь создали отдельную переменную и положили туда объект, что заставило его работать... Можете объяснить в чем была проблема поподробнее?

рони 26.09.2016 19:47

Цитата:

Сообщение от Sherminator
Можете объяснить в чем была проблема поподробнее?

нет ... с теорией у меня никак, только практика.

warren buffet 26.09.2016 20:12

Ну хорошо.

Я один раз написал рендер деревянного меню говнокодом, год не лез в него, потом совершил подвиг, залез, переписал классово и больше не полезу. Недетерминированная это штука рендер деревьев. Все работает, а почему работает - хз. )))

Pavel M. 27.09.2016 12:33

Цитата:

Сообщение от Sherminator
вы всего лишь создали отдельную переменную и положили туда объект, что заставило его работать... Можете объяснить в чем была проблема поподробнее?

может так понятнее?
без отдельной переменной

Fx.Wrap = function (obj) {
    var out = "";
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] != undefined) {
            out += '<div>' + prop + ': ' + (typeof obj[prop] == 'object' ? this.Wrap(obj[prop]) : obj[prop]) + '</div>';
        }
    }
    return out;
};

Sherminator 27.09.2016 13:28

Цитата:

Сообщение от Pavel M.
может так понятнее?

Понял свой косяк) Всем спасибо!


Часовой пояс GMT +3, время: 09:02.