将嵌套的ul li转换为json

时间:2017-04-10 12:38:06

标签: javascript jquery html json

ul li结构

<ul id="sortable" class="sortable ui-sortable">
<li id="home" class="col-sm-12 col-lg-12 "><div>home <span data-name="home" class="delete">remove</span></div>
    <ul>
            <li id="about-us" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>about-us <span data-name="about-us" class="delete">remove</span></div>
                <ul>
                    <li id="product" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>product <span data-name="product" class="delete">remove</span></div> </li>
                </ul>
            </li>
    </ul>
</li>
<li id="carrer" class="col-sm-12 col-lg-12 "><div>carrer <span data-name="carrer" class="delete">remove</span></div>
    <ul>
        <li id="product" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>product <span data-name="product" class="delete">remove</span></div></li>
        <li id="about-us" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>about-us <span data-name="about-us" class="delete">remove</span></div>
            <ul>
                <li id="home" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>home <span data-name="home" class="delete">remove</span></div></li>
            </ul>
        </li>
        <li id="product" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>product <span data-name="product" class="delete">remove</span></div>         </li>
    </ul>
</li>
    <li id="carrer" class="col-sm-12 col-lg-12 "><div>carrer <span data-name="carrer" class="delete">remove</span></div></li>
    <li id="about-us" class="col-sm-12 col-lg-12 "><div>about-us <span data-name="about-us" class="delete">remove</span></div>
        <ul>
            <li id="product" class="col-sm-12 col-lg-12" style="position: relative; left: 0px; top: 0px;"><div>product <span data-name="product" class="delete">remove</span></div> </li>
        </ul>
    </li>

我希望Json喜欢

  

{     &#34; name&#34;:&#34; home remove&#34;,     &#34;孩子&#34;:[{             &#34; name&#34;:&#34; about-us remove&#34;,                &#34;孩子&#34;:[{                        &#34; name&#34;:&#34;产品删除&#34;,                &#34;孩子&#34;:[{}],               }]     }],     &#34; name&#34;:&#34; carrer remove&#34;,     &#34;孩子&#34;:[{               &#34; name&#34;:&#34;产品删除&#34;,               &#34;孩子&#34;:[{}],            &#34; name&#34;:&#34; about-us remove&#34;,                &#34;孩子&#34;:[{                                    &#34; name&#34;:&#34; home remove&#34;,                      &#34;孩子&#34;:[{}],                    }],       &#34; name&#34;:&#34;产品删除&#34;,       &#34;孩子&#34;:[{}],     }],     &#34; name&#34;:&#34; carrer remove&#34;,     &#34;孩子&#34;:[{}],     &#34; name&#34;:&#34; about-us remove&#34;,     &#34;孩子&#34;:[{       &#34; name&#34;:&#34;产品删除&#34;,       &#34;孩子&#34;:[{}],     }]   }

我的代码如下

function buildJSON($li) {
   var subObj = { "name": $li.contents().eq(0).text().trim() };
   $li.children('ul').children().each(function() {
     if (!subObj.children) { subObj.children = []; }
     subObj.children.push(buildJSON($(this)));
   });
   return subObj;
 }

 var obj = buildJSON($("#sortable").children());
 $('#sortable').append('<pre>').find('pre').append(JSON.stringify(obj, null, 2));

输出不同的东西

  

{     &#34; name&#34;:&#34; home remove&#34;,     &#34;孩子&#34;:[       {         &#34; name&#34;:&#34; about-us remove&#34;,         &#34;孩子&#34;:[           {             &#34; name&#34;:&#34;产品删除&#34;           }         ]       },       {         &#34; name&#34;:&#34;产品删除&#34;       },       {         &#34; name&#34;:&#34; about-us remove&#34;,         &#34;孩子&#34;:[           {             &#34; name&#34;:&#34; home remove&#34;           }         ]       },       {         &#34; name&#34;:&#34;产品删除&#34;       },       {         &#34; name&#34;:&#34;产品删除&#34;       }     ]   }

有些参赛作品遗失...... 请帮助我,我错过了代码

提前致谢

2 个答案:

答案 0 :(得分:1)

在循环播放父li的每个子女后,您错过了每个ul

它不会返回单个对象。您将获得json数组格式的数据。

这是完整的JS代码。

 function FetchChild(){
     var data =[];
        $('#sortable > li').each(function(){
            data.push(buildJSON($(this)));
        });

        return data;
     }
    function buildJSON($li) {
   var subObj = { "name": $li.contents().eq(0).text().trim() };
   $li.children('ul').children().each(function() {
     if (!subObj.children) { 
        subObj.children = [];
        }
     subObj.children.push(buildJSON($(this)));
   });
   return subObj;
 }
 var obj = FetchChild();
 $('#sortable').append('<pre>').find('pre').append(JSON.stringify(obj, null, 2));

<强> Fiddle Demo

答案 1 :(得分:0)

我从仪表板主题略微扩展了列表的标准示例的脚本(侧面菜单示例):

      <ul id="side-menu" class="nav metismenu">
    <li class="active">
      <a href="index.html"><i class="fa fa-th-large"></i> <span class="nav-label">Dashboards</span> <span class="fa arrow"></span></a>
      <ul class="nav nav-second-level">
        <li class="active"><a href="index.html">Dashboard v.1</a></li>
        <li><a href="dashboard_2.html">Dashboard v.2</a></li>
        <li><a href="dashboard_3.html">Dashboard v.3</a></li>
        <li><a href="dashboard_4_1.html">Dashboard v.4</a></li>
        <li><a href="dashboard_5.html">Dashboard v.5 </a></li>
      </ul>
    </li>
    <li>
      <a href="layouts.html"><i class="far fa-gem"></i> <span class="nav-label">Layouts</span></a>
    </li>
    <li>
      <a href="#"><i class="fa fa-chart-bar"></i> <span class="nav-label">Graphs</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="graph_flot.html">Flot Charts</a></li>
        <li><a href="graph_morris.html">Morris.js Charts</a></li>
        <li><a href="graph_rickshaw.html">Rickshaw Charts</a></li>
        <li><a href="graph_chartjs.html">Chart.js</a></li>
        <li><a href="graph_chartist.html">Chartist</a></li>
        <li><a href="c3.html">c3 charts</a></li>
        <li><a href="graph_peity.html">Peity Charts</a></li>
        <li><a href="graph_sparkline.html">Sparkline Charts</a></li>
      </ul>
    </li>
    <li>
      <a href="mailbox.html"><i class="fa fa-envelope"></i> <span class="nav-label">Mailbox </span><span class="label label-warning float-right">16/24</span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="mailbox.html">Inbox</a></li>
        <li><a href="mail_detail.html">Email view</a></li>
        <li><a href="mail_compose.html">Compose email</a></li>
        <li><a href="email_template.html">Email templates</a></li>
      </ul>
    </li>
    <li>
      <a href="metrics.html"><i class="fas fa-chart-pie"></i> <span class="nav-label">Metrics</span> </a>
    </li>
    <li>
      <a href="widgets.html"><i class="fa fa-flask"></i> <span class="nav-label">Widgets</span></a>
    </li>
    <li>
      <a href="#"><i class="fa fa-edit"></i> <span class="nav-label">Forms</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="form_basic.html">Basic form</a></li>
        <li><a href="form_advanced.html">Advanced Plugins</a></li>
        <li><a href="form_wizard.html">Wizard</a></li>
        <li><a href="form_file_upload.html">File Upload</a></li>
        <li><a href="form_editors.html">Text Editor</a></li>
        <li><a href="form_autocomplete.html">Autocomplete</a></li>
        <li><a href="form_markdown.html">Markdown</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="fa fa-desktop"></i> <span class="nav-label">App Views</span> <span class="float-right label label-primary">SPECIAL</span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="contacts.html">Contacts</a></li>
        <li><a href="profile.html">Profile</a></li>
        <li><a href="profile_2.html">Profile v.2</a></li>
        <li><a href="contacts_2.html">Contacts v.2</a></li>
        <li><a href="projects.html">Projects</a></li>
        <li><a href="project_detail.html">Project detail</a></li>
        <li><a href="activity_stream.html">Activity stream</a></li>
        <li><a href="teams_board.html">Teams board</a></li>
        <li><a href="social_feed.html">Social feed</a></li>
        <li><a href="clients.html">Clients</a></li>
        <li><a href="full_height.html">Outlook view</a></li>
        <li><a href="vote_list.html">Vote list</a></li>
        <li><a href="file_manager.html">File manager</a></li>
        <li><a href="calendar.html">Calendar</a></li>
        <li><a href="issue_tracker.html">Issue tracker</a></li>
        <li><a href="blog.html">Blog</a></li>
        <li><a href="article.html">Article</a></li>
        <li><a href="faq.html">FAQ</a></li>
        <li><a href="timeline.html">Timeline</a></li>
        <li><a href="pin_board.html">Pin board</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="far fa-folder"></i> <span class="nav-label">Other Pages</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="search_results.html">Search results</a></li>
        <li><a href="lockscreen.html">Lockscreen</a></li>
        <li><a href="invoice.html">Invoice</a></li>
        <li><a href="login.html">Login</a></li>
        <li><a href="login_two_columns.html">Login v.2</a></li>
        <li><a href="forgot_password.html">Forget password</a></li>
        <li><a href="register.html">Register</a></li>
        <li><a href="404.html">404 Page</a></li>
        <li><a href="500.html">500 Page</a></li>
        <li><a href="empty_page.html">Empty page</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="fa fa-globe"></i> <span class="nav-label">Miscellaneous</span><span class="label label-info float-right">NEW</span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="toast_notifications.html">Notification</a></li>
        <li><a href="nestable_list.html">Nestable list</a></li>
        <li><a href="agile_board.html">Agile board</a></li>
        <li><a href="timeline_2.html">Timeline v.2</a></li>
        <li><a href="diff.html">Diff</a></li>
        <li><a href="pdf_viewer.html">PDF viewer</a></li>
        <li><a href="i18support.html">i18 support</a></li>
        <li><a href="sweetalert.html">Sweet alert</a></li>
        <li><a href="idle_timer.html">Idle timer</a></li>
        <li><a href="truncate.html">Truncate</a></li>
        <li><a href="password_meter.html">Password meter</a></li>
        <li><a href="spinners.html">Spinners</a></li>
        <li><a href="spinners_usage.html">Spinners usage</a></li>
        <li><a href="tinycon.html">Live favicon</a></li>
        <li><a href="google_maps.html">Google maps</a></li>
        <li><a href="datamaps.html">Datamaps</a></li>
        <li><a href="social_buttons.html">Social buttons</a></li>
        <li><a href="code_editor.html">Code editor</a></li>
        <li><a href="modal_window.html">Modal window</a></li>
        <li><a href="clipboard.html">Clipboard</a></li>
        <li><a href="text_spinners.html">Text spinners</a></li>
        <li><a href="forum_main.html">Forum view</a></li>
        <li><a href="validation.html">Validation</a></li>
        <li><a href="tree_view.html">Tree view</a></li>
        <li><a href="loading_buttons.html">Loading buttons</a></li>
        <li><a href="chat_view.html">Chat view</a></li>
        <li><a href="masonry.html">Masonry</a></li>
        <li><a href="tour.html">Tour</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="fa fa-flask"></i> <span class="nav-label">UI Elements</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="typography.html">Typography</a></li>
        <li><a href="icons.html">Icons</a></li>
        <li><a href="draggable_panels.html">Draggable Panels</a></li>
        <li><a href="resizeable_panels.html">Resizeable Panels</a></li>
        <li><a href="buttons.html">Buttons</a></li>
        <li><a href="video.html">Video</a></li>
        <li><a href="tabs_panels.html">Panels</a></li>
        <li><a href="tabs.html">Tabs</a></li>
        <li><a href="notifications.html">Notifications & Tooltips</a></li>
        <li><a href="helper_classes.html">Helper css classes</a></li>
        <li><a href="badges_labels.html">Badges, Labels, Progress</a></li>
      </ul>
    </li>

    <li>
      <a href="grid_options.html"><i class="fa fa-laptop"></i> <span class="nav-label">Grid options</span></a>
    </li>
    <li>
      <a href="#"><i class="fa fa-table"></i> <span class="nav-label">Tables</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="table_basic.html">Static Tables</a></li>
        <li><a href="table_data_tables.html">Data Tables</a></li>
        <li><a href="table_foo_table.html">Foo Tables</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="fa fa-shopping-cart"></i> <span class="nav-label">E-commerce</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="ecommerce_products_grid.html">Products grid</a></li>
        <li><a href="ecommerce_product_list.html">Products list</a></li>
        <li><a href="ecommerce_product.html">Product edit</a></li>
        <li><a href="ecommerce_product_detail.html">Product detail</a></li>
        <li><a href="ecommerce-cart.html">Cart</a></li>
        <li><a href="ecommerce-orders.html">Orders</a></li>
        <li><a href="ecommerce_payments.html">Credit Card form</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="fas fa-image"></i> <span class="nav-label">Gallery</span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li><a href="basic_gallery.html">Lightbox Gallery</a></li>
        <li><a href="slick_carousel.html">Slick Carousel</a></li>
        <li><a href="carousel.html">Bootstrap Carousel</a></li>
      </ul>
    </li>
    <li>
      <a href="#"><i class="fa fa-sitemap"></i> <span class="nav-label">Menu Levels </span><span class="fa arrow"></span></a>
      <ul class="nav nav-second-level collapse">
        <li>
          <a id="damian" href="#">Third Level <span class="fa arrow"></span></a>
          <ul class="nav nav-third-level">
            <li>
              <a href="#">Third Level Item</a>
            </li>
            <li>
              <a href="#">Third Level Item</a>
            </li>
            <li>
              <a href="#">Third Level Item</a>
            </li>
          </ul>
        </li>
        <li><a href="#">Second Level Item</a></li>
        <li>
          <a href="#">Second Level Item</a>
        </li>
        <li>
          <a href="#">Second Level Item</a>
        </li>
      </ul>
    </li>
    <li>
      <a href="css_animation.html"><i class="fa fa-magic"></i> <span class="nav-label">CSS Animations </span><span class="label label-info float-right">62</span></a>
    </li>
    <li class="landing_link">
      <a target="_blank" href="landing.html"><i class="fa fa-star"></i> <span class="nav-label">Landing Page</span> <span class="label label-warning float-right">NEW</span></a>
    </li>
    <li class="special_link">
      <a href="package.html"><i class="fa fa-database"></i> <span class="nav-label">Package</span></a>
    </li>
  </ul>

和javascript代码:

     function FetchChild(){
     var data =[];
        $('#side-menu > li').each(function(){
            data.push(buildJSON($(this)));
        });
        
        return data;
     }
    function buildJSON($li) {
   var subObj = { 
   "name": $li.contents().eq(0).text().trim() || $li.find('[class="nav-label"]').text().trim(),
   "icon": $li.find('i').attr('class'),
   "to": $li.find('a').attr('href')
   };
   $li.children('ul').children().each(function() {
     if (!subObj.children) { 
        subObj.children = [];
        }
     subObj.children.push(buildJSON($(this)));
   });
   return subObj;
 }
 var obj = FetchChild();
 $('#side-menu').append('<pre>').find('pre').append(JSON.stringify(obj, null, 2));

Fiddle Demo