javascript - 使用 JSON 和 Javascript 生成嵌套的 UL 列表

标签 javascript jquery html json

我的最终目标是创建一个 HTML 列表。列表在 JSON 字符串中定义。 示例:-

{“cluster”: [
    {“name”:”SEIR”,”cluster”:[
            {“name”:”TR 0.25”,”cluster”:[
                    {“name”:”RR 0.30”,”member”:[“sim1”,”sim5”,”sim10”]},
                    {“name”:”RR 0.35”,”member”:[“sim3”,”sim7”,”sim15”]},
                    {“name”:”RR 0.40”,”member”:[“sim6”,”sim9”,”sim25”]}
            ]},
            {“name”:”TR 0.5”,”cluster”:[
                    {“name”:”RR 0.30”,”member”:[“sim1”,”sim5”,”sim10”]},
                    {“name”:”RR 0.35”,”member”:[“sim3”,”sim7”,”sim15”]},
                    {“name”:”RR 0.40”,”member”:[“sim6”,”sim9”,”sim25”]}
            ]}
    ]},
    {“name”:”SIR”,”cluster”:[
            {“name”:”TR 0.25”,”cluster”:[
                    {“name”:”RR 0.30”,”member”:[“sim1”,”sim5”,”sim10”]},
                    {“name”:”RR 0.35”,”member”:[“sim3”,”sim7”,”sim15”]},
                    {“name”:”RR 0.40”,”member”:[“sim6”,”sim9”,”sim25”]}
            ]},  
            {“name”:”TR 0.5”,”cluster”:[
                    {“name”:”RR 0.30”,”member”:[“sim1”,”sim5”,”sim10”]},
                    {“name”:”RR 0.35”,”member”:[“sim3”,”sim7”,”sim15”]},
                    {“name”:”RR 0.40”,”member”:[“sim6”,”sim9”,”sim25”]}
            ]}
    ]}
]}

预期的输出 HTML 列表如下所示:

<UL>
   <LI>SEIR
      <UL>
         <LI>TR 0.25
            <UL>
               <LI>RR 0.25
                  <UL>
                     <LI>sim1</LI>
                     <LI>sim5</LI>
                     <LI>sim10</LI>
                  </UL>
               </LI>
               <LI>RR 0.50
                  <UL>
                     <LI>sim3</LI>
                     <LI>sim7</LI>
                     <LI>sim15</LI>
                  </UL>
               </LI>
            </UL>
         </LI>
         <LI>TR 0.25
            <UL>
               <LI>RR 0.25
                  <UL>
                     <LI>sim1</LI>
                     <LI>sim5</LI>
                     <LI>sim10</LI>
                  </UL>
               </LI>
               <LI>RR 0.50
                  <UL>
                     <LI>sim6</LI>
                     <LI>sim9</LI>
                     <LI>sim25</LI>
                  </UL>
               </LI>
            </UL>
         </LI>
      </UL>
   </LI>
.
.
.
.
.

我写了下面的javascript代码

function appendClusterNode(data){
    var liNode = document.createElement('li');
    var textNode = document.createTextNode(data.name);
    liNode.appendChild(textNode);
    if(data['cluster']){
        alert('Cluster Present');
        var newULNode = document.createElement('ul');
        var tempNode;
        for (var cluster = 0 ; cluster < data.cluster.length ; cluster++){
            alert(data.cluster[cluster].name);
            tempNode = appendClusterNode(data.cluster[cluster]);
            newULNode.appendChild(tempNode);
        }
        liNode.appendChild(newULNode);
    }else{
        if('member'){
            var ulNode = createElement('ul');
            var tempLINode;
            for (var member = 0 ; member < data.member.length ; member++){
                tempLINode = document.createElement('li');
                tempLINode.appendChild(document.createTextNode(data.member[member]));
                ulNode.appendChild(tempLINode);
            }
            liNode.appendChild(ulNode);
        }
    }
    return liNode;
}
function appendRootNode(node, data){
    var ulNode = document.createElement('ul');
    var liNode = document.createElement('li');
    var textNode = document.createTextNode(data.name);
    liNode.appendChild(textNode);
    if(data['cluster']){
        var newULNode = document.createElement('ul');
        var tempNode;
        for (var cluster = 0 ; cluster < data.cluster.length; cluster++){
            alert(data.cluster[cluster].name);
            tempNode = appendClusterNode(data.cluster[cluster]);
            newULNode.appendChild(tempNode);
        }
        liNode.appendChild(newULNode);
    }
    ulNode.appendChild(liNode);
    node.appendChild(ulNode);
}
//Below is the simple JSON UL string
var JSONString = '{"name":"Epidemic","cluster":[{"name":"SEIR","cluster":[{"name":"RR 0.30","member":["sim1","sim5","sim10"]},{"name":"RR 0.35","member":["sim3","sim7","sim15"]}]},{"name":"SIR","member":["1","2","3"]}]}';
var JSONData = JSON.parse(JSONString);
appendRootNode(document.getElementById("hierarchy"), JSONData);

此代码未生成所需的输出。我想我在函数中出错了。

最佳答案

以下代码对我有用 -

        function appendMemberNode(data){
        var mULNode = document.createElement('ul');
        var mLINode;
        var mTextNode;
        for (var  i = 0 ; i < data.length ; i++){
            mLINode = document.createElement('li');
            mTextNode = document.createTextNode(data[i].name);
            mLINode.appendChild(mTextNode);
            if (i == data.length-1){
                mLINode.setAttribute("class","member last");
            }else{
                mLINode.setAttribute("class","member");
            }
            mULNode.appendChild(mLINode);
        }
        return mULNode
    }
    function appendClusterNode(data){
        var cULNode = document.createElement('ul');
        var cLINode; 
        var cTextNode;
        for (var i = 0 ; i < data.length ; i++){
            cLINode = document.createElement('li');
            cTextNode = document.createTextNode(data[i].name);
            cLINode.appendChild(cTextNode);
            if (data[i]['cluster']){
                var cTempNode = appendClusterNode(data[i].cluster);
                cLINode.appendChild(cTempNode);
            }else{
                // Has leaf Nodes i.e. Has Members
                var mTempNode = appendMemberNode(data[i].member);
                cLINode.appendChild(mTempNode);
            }
            if (i == data.length-1){
                cLINode.setAttribute("class","last");
            }
            cULNode.appendChild(cLINode);
        }
        return cULNode;
    }
    function appendRootNode(node, data){
        var rootULNode = document.createElement('ul');
        var rootLINode = document.createElement('li');
        var rootTextNode = document.createTextNode(data.name);
        rootLINode.appendChild(rootTextNode);
        if (data['cluster']){
            var tempNode = appendClusterNode(data.cluster);
            rootLINode.appendChild(tempNode);
        }
        rootULNode.appendChild(rootLINode);
        rootULNode.setAttribute("class","collapsibleList");
        rootULNode.setAttribute("id","clustering");
        node.appendChild(rootULNode);
    }

我想我可能还会优化代码。

关于javascript - 使用 JSON 和 Javascript 生成嵌套的 UL 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29090700/

相关文章:

javascript - 在 AngularJS 中将键值插入数组时出现 “.push is not a function” 错误

css - 父 DIV 中有 2 个 float DIV 和 1 个居中 DIV

javascript - 带有 javascript 文件的 html 图表

html - CSS 代码帮助居中图像,但它以某种方式恢复到当前编码的左侧

javascript - LokiJS:简单的查找查询返回错误的结果

javascript - 如何正确居中 facebox ajax 请求?

javascript - jquery 网格中的过滤器工具栏中未填充下拉列表

jquery - 为什么我的覆盖层无法覆盖 Bootstrap 导航栏?

jQuery UI $.datepicker.noWeekends 不工作

javascript - Javascript 变量的窗口与应用程序范围