Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.07.2015, 23:30
Аспирант
Отправить личное сообщение для Dtri Посмотреть профиль Найти все сообщения от Dtri
 
Регистрация: 14.12.2014
Сообщений: 86

построит список из объекта
Здравствуйте!
Есть вот такой объект.
jsonTree = {
        "firstName": "Иван",
        "lastName": "Иванов",
        "address": {
            "streetAddress": "Московское ш., 101, кв.101",
            "city": "Ленинград",
            "postalCode": 101101
        },
        "address2": [
            "Адрес",
            {
                "streetAddress2": "Московское ш., 101, кв.101",
                "city2": "Ленинград",
                "adress3": 101101
            }
        ],
        "phoneNumbers": [
            "812 123-1234",
            "916 123-4567"
        ]
    };


вложенность у этого объекта может быть неограниченная

Задача: Построить из него вот такой список (тоже не ограниченной вложенности).



<div class="tree">

   <ul>
            <li><input type="checkbox" name="firstName">Иван</li>
            <li><input type="checkbox" name="lastName">Иванов</li>
            <li><input type="checkbox" name="address">
                <ul>
                    <li><input type="checkbox" name="streetAddress">Московское ш., 101, кв.101</li>
                    <li><input type="checkbox" name="city">Ленинград</li>
                    <li><input type="checkbox" name="postalCode">101101</li>
                </ul>
            </li>
            <li><input type="checkbox" name="address2">Адрес
                <ul>
                    <li><input type="checkbox" name="streetAddress2">Московское ш., 101, кв.101</li>
                    <li><input type="checkbox" name="city2">Ленинград</li>
                    <li><input type="checkbox" name="postalCode2">101101</li>
                </ul>
            </li>
            <li><input type="checkbox" name="phoneNumbers">
                <ul>
                    <li>812 123-1234</li>
                    <li>812 123-1234</li>
                </ul>
            </li>
  </ul>

</div>


Начал вот с такого:
$('.tree').append('<ul></ul>');
    for (var key in jsonTree)   {
        x++;
        $('.tree ul').append('<li><input type="checkbox" name="'+key+'">'+jsonTree[key]+'</li>');

    }



Естественно этот вариант не отображает вложенность.
<ul>
        <li><input type="checkbox" name="firstName">Иван</li>
        <li><input type="checkbox" name="lastName">Иванов</li>
        <li><input type="checkbox" name="address">[object Object]</li>
        <li><input type="checkbox" name="address2">Адрес,[object Object]</li>
        <li><input type="checkbox" name="phoneNumbers">812 123-1234,916 123-4567</li>
    </ul>

Вот тут начинается самое сложное.
как сделать такой перебор чтобы по всем ключам проходил.
Хотя может не правильно мыслю.
Подскажите как реализовать эту задачу.

Подчёркиваю. объект с сервера может приходить неограниченной вложенности, соответственно и список рисоваться должен неограниченной вложенностью.

Последний раз редактировалось Dtri, 15.07.2015 в 23:35.
Ответить с цитированием
  #2 (permalink)  
Старый 15.07.2015, 23:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Dtri
как сделать такой перебор чтобы по всем ключам проходил
Проверять, если jsonTree[key] объект, значит вложение, запоминать тег открытый, и извлекать его после выхода из цикла обхода вложения.
Ответить с цитированием
  #3 (permalink)  
Старый 15.07.2015, 23:59
Аватар для jasper-blondin
Аспирант
Отправить личное сообщение для jasper-blondin Посмотреть профиль Найти все сообщения от jasper-blondin
 
Регистрация: 11.07.2015
Сообщений: 33

Нужно написать рекурсивную функцию, которая выводит элементы списка в заданной форме для уровня вложенности "один". На каждой итерации проверять, является ли текущий экземпляр сам по себе объектом, если да -- запускать эту же функцию, но уже для текущего объекта.
Ответить с цитированием
  #4 (permalink)  
Старый 16.07.2015, 00:54
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Попробовал написать, но у меня чет фигня пока получается, лишний элемент <li> каждый раз вставляется.

<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
</head>
<body>
  <div class="tree"></div>

  <script>
    $(document).ready(function() {
      var jsonTree = {
        "firstName": "Иван",
        "lastName": "Иванов",
        "address": {
          "streetAddress": "Московское ш., 101, кв.101",
          "city": "Ленинград",
          "postalCode": 101101
        },
        "address2":  {
          "streetAddress2": "Московское ш., 101, кв.101",
          "city2": "Ленинград",
          "adress3": 101101
        }
      };

      function createList(obj) {
        debugger;
        if(typeof obj !== 'object') return;

        var ul = $('<ul />');

        for(var key in obj) {
          var item = $('<li> <input type="checkbox" name="' + key + '" />' + (obj[key] == '[object Object]' ? key : obj[key]) +'<li />');            
          var ulChilds = createList(obj[key]);
          ulChilds && item.append(ulChilds);
          ul.append(item);
        }
        return ul;
      }

      $('.tree').append( createList(jsonTree) );
    });
  </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 16.07.2015, 01:18
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Decode
Попробовал написать, но у меня чет фигня пока получается
Сперва надо входные данные к нормальному виду привести, а то у него один объект имеет метку "Адрес", а точно такой же выше без нее. Если такие данные будут, то или условностями все обрастет или запутаться можно.
Ответить с цитированием
  #6 (permalink)  
Старый 16.07.2015, 02:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от laimas
Если такие данные будут, то или условностями все обрастет

при нормальных данных строка 43 будет в трое короче
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">

  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
     $(function(){
 var jsonTree = {
        "firstName": "Иван",
        "lastName": "Иванов",
        "address": {
            "streetAddress": "Московское ш., 101, кв.101",
            "city": "Ленинград",
            "postalCode": 101101
        },
        "address2": [
            "Адрес",
            {
                "streetAddress2": "Московское ш., 101, кв.101",
                "city2": "Ленинград",
                "adress3": 101101
            }
        ],
        "phoneNumbers": [
            "812 123-1234",
            "916 123-4567"
        ]
    };
 function fn(b) {
     var d = $("<ul>");
     Object.keys(b).forEach(function(a) {
         var c = $("<li/>"),
             e = $("<input/>", {
                 type: "checkbox",
                 name: a
             });
         "string" === $.type(b[a]) || "number" === $.type(b[a]) ? c.append(b[a]) : "address2" === a ? c.append(b[a][0]).append(fn(b[a][1])) : c.append(fn(b[a]));
         isNaN(+a) && c.prepend(e);
         c.appendTo(d)
     });
     return d
 };
$("body").append(fn(jsonTree))
});
  </script>
</head>

<body>


</body>

</html>

Последний раз редактировалось рони, 16.07.2015 в 02:25.
Ответить с цитированием
  #7 (permalink)  
Старый 16.07.2015, 09:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от рони
при нормальных данных строка 43 будет в трое короче
Ну да, а то какая-то несуразица получается - данные из базы, где они имеют одну и ту же структуру у каждого субъекта, но почему-то первый адрес это объект, а второй, это уже объект как элемент массива. И что интересно, это неограниченная вложенность, которую можно решить рекурсией, вот только трудно представить как будет на клиенте такое неограниченное вложение выглядеть, и как серверу обработать данные с таким "неограниченным именованием".

Что-то тут изначально представлено не то. )
Ответить с цитированием
  #8 (permalink)  
Старый 19.07.2015, 03:17
Аспирант
Отправить личное сообщение для Dtri Посмотреть профиль Найти все сообщения от Dtri
 
Регистрация: 14.12.2014
Сообщений: 86

Всем спасибо за участие. Приношу извинения за столь долгий ответ.

Пересмотрел ваши варианты. Вы очень помогли идеей с рекурсией. Многое подчеркнул из примера рони

Но решил воспользоваться более стандартным циклом. и немного перебрал алгоритм, так как вариант автора не предполагал не ограниченной вложенности. В условии (
"string" === $.type(b[a]) || "number" === $.type(b[a]) ? c.append(b[a]) : "address2" === a ? c.append(b[a][0]).append(fn(b[a][1])) : c.append(fn(b[a]));
) приходилось бы дописывать лишние параметры при дальнейшем увеличении вложенных пунктов списка. а задача заключалась именно в создании универсального плагина.

Вот например данная вложенность как показано ниже у автора вызывала артефакты.

Вот что получилось в итоге:

Что касается рекурсии. всё понятно. Но хотелось бы методом итерации. Может кто-нибудь подскажет способ?




<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

    </head>
    <body>
        <div class="tree"></div>

        <script>$(document).ready(function () {
            var jsonTree = {
                "firstName": "Иван",
                "lastName": "Иванов",
                "address1": {
                    "streetAddress1": "streetAddress1",
                    "city1": "city1",
                    "postalCode1": {
                        "streetAddress1": "streetAddress1",
                        "city1": "city1",
                        "postalCode1": {
                            "streetAddress1": "streetAddress1",
                            "city1": "city1",
                            "postalCode1": 'postalCode1'
                        }
                    }
                },
                "address2": [
                    "Адрес",
                    {
                        "streetAddress2": "streetAddress2",
                        "city2": "city2",
                        "postalCode2": [
                            "postalCode2",
                            {
                                "streetAddress2": "streetAddress2",
                                "city2": "city2",
                                "postalCode2": [
                                    "postalCode2",
                                    {
                                        "streetAddress2": "streetAddress2",
                                        "city2": "city2",
                                        "postalCode2": [
                                            "postalCode2",
                                            {
                                                "streetAddress2": "streetAddress2",
                                                "city2": "city2",
                                                "postalCode2": [
                                                    "postalCode2",
                                                    {
                                                        "streetAddress2": "streetAddress2",
                                                        "city2": "city2",
                                                        "postalCode2": 'postalCode2'
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ],
                "phoneNumbers": [
                    "812 123-1234",
                    "812 123-1234"
                ]
            };
          

            //$('.tree').append(JSONtree(jsonTree));

            (function ($) {


                function JSONtree(obj) {
                    var
                            ul = $('<ul/>');
                    for (var key in obj) {
                        var
                                li = $('<li/>'),
                                input = $('<input/>', {
                                    type: "checkbox",
                                    name: key
                                });
                       
                        if ($.type(obj[key]) == 'string' || $.type(obj[key]) == 'number') {
                            li.append(input).append(obj[key]);
                            ul.append(li);
                        }
                        if ($.type(obj[key]) == 'array' && $.type(obj[key][1]) !== 'object') {
                            li.append(input).append('Без названия').append(JSONtree(obj[key]));
                            ul.append(li);
                        }
                        if ($.type(obj[key]) == 'array' && $.type(obj[key][1]) == 'object') {
                            li.append(input).append(obj[key][0]).append(JSONtree(obj[key][1]));
                            ul.append(li);
                        }
                        if ($.type(obj[key]) == 'object') {
                            li.append(input).append('Без названия').append(JSONtree(obj[key]));
                            ul.append(li);
                        }
                    }
                    return ul;
                }

                $.fn.JSONtreeAppend = function (obj) {
                    return this.append(JSONtree(obj));
                }
            })(jQuery);
            $('.tree').JSONtreeAppend(jsonTree);
        });</script>
    </body>
</html>

Последний раз редактировалось Dtri, 19.07.2015 в 03:27.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выдать список всех свойств указанного при вводе объекта указанного фрейма flasher167 Общие вопросы Javascript 11 05.04.2013 08:14
селект переделанный под список Vasёk18 Элементы интерфейса 0 13.04.2012 23:49
Заполнить список значениями из динамически созданного выпадающего списка zhuzha Элементы интерфейса 0 17.08.2010 14:40
Как получить список пользовательских функций объекта window? Маэстро Events/DOM/Window 13 03.07.2010 13:20
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00