【问题标题】:json to nested unordered listjson 到嵌套无序列表
【发布时间】:2016-05-18 20:14:37
【问题描述】:

我正在尝试将 JSON 转换为 jQuery 中的无序列表。这是我的 JSON 数据。

var myJSON = "{name:\"Director\",children:[name:\"Exe Director1\",name:\"Exe Director2\",name:\"Exe Director3\",children:[name:\"Sub Director1\",name:\"Sub Director2\",name:\"Sub Director3\",children:[name:\"Cameraman 1\",name:\"Cameraman 2\"]]]}";

预期的输出是

<ul>
    <li>Director
        <ul>
            <li>Exe Director 1</li>
            <li>Exe Director 2</li>
            <li>Exe Director 3
                <ul>
                    <li>Sub Director 1</li>
                    <li>Sub Director 2</li>
                    <li>Sub Director 3
                        <ul>
                            <li>Cameraman 1</li>
                            <li>Cameraman 2</li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我该怎么做!

干杯,

【问题讨论】:

标签: jquery html json html-lists


【解决方案1】:

这正是您所需要的:

使用 jQuery 模板 API。这曾经是 jQuery 的一部分,但目前只能作为插件使用。不过,我认为 jQuery 很快就会再次采用这种或类似的技术。

http://api.jquery.com/category/plugins/templates/

它超级好用:

$.tmpl("template", jsonObject)

这里是一个小的基本模板示例:

$.tmpl(
    "<li><b>${Id}</b>${Name}</li>", 
    [{Id:1, Name:"Werner"}, {Id:2, Name:"Klaus"}]
);

这将产生以下可以附加到任何地方的 jQuery HTML 元素:

  • 1 维尔纳
  • 2 克劳斯
  • 对于您的复杂数据,您还可以使用“{{each}}”模板表示法迭代 JSON 子对象。这里是您的数据和模板的代码:

    var data = {name:"Director",children:[{name:"Exe Director1"},{name:"Exe Director2"},{name:"Exe Director3", children:[{name:"Sub Director3_1"},{name:"Sub Director3_2"},{name:"Sub Director3_3",children:[{name:"Cameraman3_3_1"},{name:"Cameraman3_3_2"}]}]}]};
    
    var template = '\
        <ul>\
            <li>${name}\
                <ul>\
                    {{each(childindex, child) children}}\
                        <li>${child.name}\
                            <ul>\
                                {{each(child2index, child2) child.children}}\
                                    <li>${child2.name}</li>\
                                {{/each}}\
                            </ul>\
                        </li>\
                    {{/each}}\
                </ul>\
            </li>\
        </ul>\
    ';
    
    $('body').empty().append($.tmpl(template, data));
    

    浏览器结果:

    • 导演
      • Exe Director1
        • Exe Director2
          • Exe Director3
            • Sub Director3_1
            • Sub Director3_2
            • Sub Director3_3
            • ...

        这可以通过包含嵌套模板进行调整以支持完全递归......但我是一个懒惰的人,剩下的就是为你做的。

        干杯, 会

        【讨论】:

        • 我会考虑使用另一个模板引擎,因为 jQuery 模板仍处于测试阶段,不再维护。
        • jsRender 将是任何新开发的不错选择。 jQuery 模板已停止使用。正如Klaster_1github.com/jquery/jquery-tmpl#readme Note: The jQuery team has decided not to take this plugin past beta. It is no longer being actively developed or maintained. See vBeta1.0.0 tag for released beta version. Requires jQuery version 1.4.2. 所提到的,任何未解决的问题都不会得到解决并保持开放。
        • 好的,JsRender 语法几乎 100% 相同。我一检查 JsRender 就会更新我的帖子。
        • 快速说明 - 这可能是更新您的示例的好时机,因为它仍然在 Google 中浮动。这是 JS 渲染 - github.com/borismoore/jsrender
        【解决方案2】:

        您可以如下使用递归函数。每次调用该函数时,它都会返回一个“UL”及其子“LI”。

        function generateMenu(data) {
        
            var ul = $("<ul>");
        
                $(data).each(function (i, dir) {
                     var li = $('<li>' + dir.name + '</li>');
                     ul.append(li);
        
                    if (dir.children != null && dir.children.length > 0) {
                        li.append(generateMenu(dir.children));
                    }
        
                });
        
            return ul;
        };
        

        将其用作:

        $("#some-div").append(generateMenu(myJsonData));

        Json 是,

        var myJsonData = JSON.parse('{"name": "Director","children": [{ "name": "Exe Director1" },{ "name": "Exe Director2" },{"name ": "Exe Director3","children": [{ "name": "Sub Director1" },{ "name": "Sub Director2" },{"name": "Sub Director3","children": [{ "name": "Cameraman 1" },{ "name": "Cameraman 2" }]}]}]}');

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-04
          • 2020-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多