【问题标题】:Convert JSON to an unordered HTML list (DFS?)将 JSON 转换为无序列的 HTML 列表(DFS?)
【发布时间】:2017-09-30 05:08:33
【问题描述】:

我在将 JSON 转换为列表时遇到了一点问题。我能够阅读所有元素,但目前它在结构上列出了错误的列表。

这里是 JSON:

{
  name: 'test,
  value: 'value',
  nodes: [
    {
      name: 'next test',
      value: 'next value',
      nodes: [...]
    },
    {
      name: 'third test',
      value: 'third value',
      nodes: [...]
    }
  ]
}

我想创建这样的东西:

<ul>
  <li>test: value</li>
  <ul>
    <li>next test: next value</li>
    <li>third test: third value</li>
  </ul>
</ul>

我在 CoffeeScript 中创建了一个循环,但它却做了这样的事情:

<ul>
  <li>test: value</li>
    <ul>
      <li>next test: next value</li>
      <ul>
        <li>third test: third value</li>
      </ul>
    </ul>
  </ul>

所以一切都是相互嵌套的。

这是我的代码:

point = $('#jstree_demo_div');

        loopData = (node) ->
          if(node.name != undefined)
            name = node.name;
            value = node.value;
            ul = $('<ul>');
            li = $('<li>');
            li.append(name + ' - <b>' + value + '</b>');
            ul.append(li);
            point.append(ul);
            point = li;
            for chart in node.nodes
              loopData(chart);

        loopData(json);

知道我应该在此处更改什么以制作正确的结构列表吗?

有这个条件:

if(node.name != undefined)

因为当名称未定义时,它不应该转到下一个更深的节点。

【问题讨论】:

  • 您正在分配 point = li,然后是 point.append(ul)。因此将 ul 嵌套在 li 中。我不知道语法,所以我不能写一个工作示例:(

标签: javascript json coffeescript microsoft-distributed-file-system


【解决方案1】:

这是一个使用原生 Javascript 的答案:

  var json = {
    name: 'test',
    value: 'value',
    nodes: [
      {
        name: 'next test',
        value: 'next value',
        nodes: [{}]
      },
      {
        name: 'third test',
        value: 'third value',
        nodes: [{}]
      }
    ]
  }

  function makeNewList(obj) {
    // if the object does not contain children, make a 'li' element only
    if (obj.nodes[0].name === undefined) {
      var res = document.createElement('li');
      res.innerHTML = obj.name + ": " + obj.value;
      return res;
    }
    // otherwise, first make a 'ul' element with main name and value, then
       // nest a new 'ul' with child nodes inside
    else {
      var res = document.createElement('ul');
      var nameLi = document.createElement('li');
      nameLi.innerHTML = obj.name + ": " + obj.value;
      res.appendChild(nameLi);
      var nestedNodes = document.createElement('ul');
      obj.nodes.forEach(function(node) {
        nestedNodes.appendChild(makeNewList(node));
      })
      res.appendChild(nestedNodes);
      return res
    }
  }

【讨论】:

  • 谢谢!它会停止吗: if(node.name != undefined) ?
  • 我编辑了代码,现在使用假定的 json。不确定这是否真的是您想要的。如果您提供了 json 的完整示例,这将有所帮助,因此 nodes 属性中的括号之间没有点
  • 这是我的 JSON:gyazo.com/…。请注意,当节点中只有数组,没有'name'属性时,我们应该停止深入。
  • 谢谢,但我真正需要的是没有名称属性的最后一个节点的示例。因为你现在描述的正是我试图用示例json 做出的。 (即没有名称属性的空对象)。
  • 嗯,在我的截图上是最后一个没有 name 属性的节点。只有数组,我们不想进去。最后一个
  • 我们要显示的名称和值是“Renata Lupa”,因为在下一个节点中我们没有任何名称。
猜你喜欢
相关资源
最近更新 更多
热门标签