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

时间:2018-06-21 10:21:34

标签: jquery json typescript d3.js powerbi

我正在Microsoft Power BI中创建自定义图像。创建api使用打字稿和d3库。我也在用jQuery

我正在尝试创建一个层次结构树,以表示拖到视觉对象中的字段。因此,树的深度是在运行时确定的,因此它不知道它将有多少层。

我设法将我的伪数据安排到一个嵌套的JSON数组中。

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

screenshot

[{ "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

这是我在控制台中对JSON.stringify进行数据化时的样子,我也只使用了2个字段,所以不会太混乱。

“身份”:{long text} ,不是这样显示的。标识字段用于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>

我在网络上找到了许多解决此类问题的方法,但似乎没有什么适合我的需求。

有人可以帮我提供有效的代码段吗?

预先感谢

2 个答案:

答案 0 :(得分:2)

这是一个演示如何使用纯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'); 
}
  
<div class="container">
</div>

答案 1 :(得分:2)

JavaScript ES6 和一个小的递归函数

/**
 * Convert Tree structure to UL>LI and append to Element
 * @syntax getTree(treeArray [, TargetElement [, onLICreatedCallback ]])
 *
 * @param {Array} tree Tree array of nodes
 * @param {Element} el HTMLElement to insert into
 * @param {function} cb Callback function called on every LI creation
 */

const treeToHTML = (tree, el, cb) => el.append(
  tree.reduce((ul, n) => {
    const li = document.createElement("li");

    if (cb) cb.call(li, n);
    if (n.nodes?.length) treeToHTML(n.nodes, li, cb);

    ul.append(li);
    return ul;
  }, document.createElement("ul"))
);





// DEMO TIME:

const myTree = [{
  "id": 1,
  "parent_id": 0,
  "name": "Item1",
  "nodes": [{
    "id": 2,
    "parent_id": 1,
    "name": "Item2"
  }]
}, {
  "id": 4,
  "parent_id": 0,
  "name": "Item4",
  "nodes": [{
      "id": 9,
      "parent_id": 4,
      "name": "Item9"
    }, {
      "id": 5,
      "parent_id": 4,
      "name": "Item5",
      "nodes": [{
        "id": 3,
        "parent_id": 5,
        "name": "Item3"
      }]
    }
  ]
}];

treeToHTML(myTree, document.querySelector("#demo"), function(node) {
  this.textContent = `${node.parent_id} ${node.id} ${node.name}`
});
<div id="demo"></div>