0

我正在尝试在javascript中创建一个带有递归函数的html列表,但我真的不明白为什么实际结果与我的预期结果不符。

json

{
    "sections": {
        "1": {
            "name": "Section 1",
            "sections": {
                "3": {
                    "name": "Section 1.1",
                    "sections": {
                        "4": {
                            "name": "Section 1.1.1",
                            "sections": {}
                        }
                    }
                }
            }
        },
        "2": {
            "name": "Section 2",
            "sections": {}
        }
    }
}

Javascript

$(document).ready(function() {
    generateHtml(myLoadedJson);
});

function generateHtml(pData) {
    var self = this;
    var html = '';
    if("sections" in pData) {
        html+= '<ul>';
        var objList = Object.keys(pData.sections);
        var nbr = objList.length;
        for(i=0; i<nbr; i++) {
            var key = objList[i];
            var obj = pData.sections[key];
            html+= '<li><div>' + obj.name + '</div>'
            html+= generateHtml(pData.sections[key]);
            html+= '</li>';
        }
        html+= '</ul>';
    }
    return html;
};

预期结果

<ul>
  <li>
    <div>Section 1</div> 
    <ul>
      <li>
        <div>Section 1.1<div>
        <ul>
          <li>
            <div>Section 1.1.1<div>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>
    <div>Section 2</div>
  </li>
</ul>

实际结果

<ul>
  <li>
    <div>Section 1</div>
    <ul>
      <li>
        <div>Section 1.1</div>
        <ul>
          <li>
            <div>section 1.1.1</div>
            <ul></ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

有人有想法吗?

4

2 回答 2

4

我认为问题出在你的 for 循环中:

for(i = 0; i < nbr; i++)

应该:

for(var i=0; i<nbr; i++)

本质上,generateHtml(...)函数的所有调用都共享同一个循环变量 ( i)。因此,当子调用增加时i,调用循环i也会增加。通过添加var,您可以确保每个调用都有自己的局部变量。

于 2013-08-24T23:59:18.023 回答
0

您所做的唯一错误是在循环中使用了全局变量“i”。

for(i = 0; i < nbr; i++)

相反,您应该将语句编写为:

for(var i = 0; i < nbr; i++)

确保为循环使用局部变量。

您可以使用以下链接查看工作示例

于 2019-04-26T06:38:18.107 回答