I have the following array and I want to create an unordered list from it, but I am having trouble generating the unordered list in the proper format. I have searched similar questions but none of the existing solutions work for my problem.
var myArray = ['Value 1', ['Inner value 1', 'Inner value 2', 'Inner value 3', 'Inner value 4'], 'Value 2', 'Value 3', 'Value 4', 'Value 5', 'Value 6'];
Here is my JavaScript code:
function arrToUl(arr) { var div = document.getElementById('myList'); var ul = document.createElement('ul'); for (var i = 0; i < arr.length; i++) { if (arr[i] instanceof Array) { var list = arrToUl(arr[i]); } else { var li = document.createElement('li'); li.appendChild(document.createTextNode(arr[i])); console.log(ul.appendChild(li)); } div.appendChild(ul); } } arrToUl(myArray);
The above code is producing the following result:
<ul> <li>Value 1</li> <li>Inner Value 1</li> <li>Inner Value 2</li> <li>Inner Value 3</li> <li>Inner Value 4</li> <li>Value 2</li> <li>Value 3</li> <li>Value 4</li > <li>Value 5</li > <li>Value 6</li>
But the result should look like below:
<ul> <li>Value 1 <ul> <li>Inner Value 1</li> <li>Inner Value 2</li> <li>Inner Value 3</li> <li>Inner Value 4</li> </ul> </li> <li>Value 2</li> <li>Value 3</li> <li>Value 4</li> <li>Value 5</li> <li>Value 6</li>
Thank you for your help.
Advertisement
Answer
You’ve appended all the <ul>
elements to the myList <div>
. To change that, I’ve added a new parameter to the arrToUl(root, arr)
function.
The new parameter, root
, determines who the created <ul>
should be appended to, so if the function encounters a sub-array, it uses the previous list item as the root for the creation of the sub-list.
var myArray = ['Value 1', ['Inner value 1', 'Inner value 2', 'Inner value 3', 'Inner value 4'], 'Value 2', 'Value 3', 'Value 4', 'Value 5', 'Value 6']; function arrToUl(root, arr) { var ul = document.createElement('ul'); var li; root.appendChild(ul); // append the created ul to the root arr.forEach(function(item) { if (Array.isArray(item)) { // if it's an array arrToUl(li, item); // call arrToUl with the li as the root return; } li = document.createElement('li'); // create a new list item li.appendChild(document.createTextNode(item)); // append the text to the li ul.appendChild(li); // append the list item to the ul }); } var div = document.getElementById('myList'); arrToUl(div, myArray);
<div id="myList"></div>