将 JSON 数组转换为 <ul> 和 <li> 元素

dar*_*man 5 jquery json d3.js typescript powerbi

我正在 Microsoft Power BI 中创建自定义视觉对象。创建 api 使用 typescript 和 d3 库。我也在使用jquery

我正在尝试创建一个分层树来表示拖入视觉对象的字段。因此树的深度是在运行时决定的,所以它不知道它有多少层。

我已成功将虚拟数据排列到嵌套的 JSON 数组中。

这是我执行 console.log(finalViewModel) 时控制台的屏幕截图

截屏

[{ "text": "France","id": 591, "parent": 0, "identity": {long text},
   "nodes"
        [{"text": "Bread", "id", 478, "parent": 591, "identity: {long text}, 
        "nodes" []}, 
        {"text": "Nocco", "id", 498, "parent": 591, "identity: {long text}, 
        "nodes" []}, 
        {"text": "Red Wine", "id", 718, "parent": 591, "identity: {long 
        text}, 
        "nodes" []}]},
   {"text: "Germany", "id" .....so on and so forth
Run Code Online (Sandbox Code Playgroud)

这就是我在控制台中对数据进行 JSON.stringify 时的样子,而且我只使用了 2 个字段,因此不会太混乱。

“身份”:{长文本},不会这样显示。标识字段用于 Power BI 选择管理器,因此当单击树中的某些内容时,它将呈现为其他视觉效果。长文本是保存特定项目标识信息的超长数组的替代品。

现在问题来了,我想将 JSON 数据转换为 ul 和 li 元素。像这样:

 <ul>
    <li>France</li>
    <ul>
        <li>Baguette</li>
        <li>Nocco</li>
        <li>Red Wine</li>
    </ul>
    <li>Germany</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我在网上找到了很多此类问题的解决方案,但似乎没有一个能满足我的需求。

谁能帮我编写一个有效的代码片段?

提前致谢

FSo*_*ou1 4

这是一个如何使用纯 JavaScript 实现的演示。

var createSublist = function(container, args) {
  var ul = document.createElement('ul');
  
  for(var j = 0; j < args.length; j++) {
    var row = args[j];
    
    var li = document.createElement('li');
    li.innerText = row.text;
    
    var nodes = row.nodes;
    if(nodes && nodes.length) {
      createSublist(li, nodes);
    }
    
    ul.appendChild(li);
  }
  
  container.appendChild(ul);
};

var data =[  
   {  
      "text":"France",
      "nodes":[  
         {  
            "text":"Bread"
         },
         {  
            "text":"Nocco"     
         }
      ],

   },
   {  
      "text":"Italy",
      "nodes":[  
         {  
            "text":"Pizza"
         },
         {  
            "text":"Wine",
            "nodes": [
              { 
              	"text": "Red"
              },
              { 
              	"text":"White"
              }
            ]
         }
      ]
   }
];

var container = document.getElementsByClassName('container')[0];  
if(container) 
{ 
  createSublist(container, data);
} 
else 
{
  console.log('Container has not been found'); 
}
  
Run Code Online (Sandbox Code Playgroud)
<div class="container">
</div>
Run Code Online (Sandbox Code Playgroud)