6

How can I build a nested UL structure from an object of paths using JavaScript?

For example given the following array of paths:

var paths = [
  "d1/d2/d3/file1.txt",
  "d1/d2/d3/file2.txt",
];

I would like to build the following UL

<ul class="base-UL">
  <li class="folder">d1
    <ul>
      <li class="folder">d2
        <ul>
          <li class="folder">d3
            <ul>
              <li class="file" data-url="d1/d2/d3/file1.text">file1.text</li>
              <li class="file" data-url="d1/d2/d3/file2.text">file2.text</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

How should I build a recursive function that does this?

Edit I was able to succefully write a function which does this however, I can't figure out how to get the full path as the data attribute in the file elements: See below:

function buildFromPathList(paths) {
  for (var i = 0, path; path = paths[i]; ++i) {
    var pathParts = path.split("/");
    var subObj = tree_;

    for (var j = 0, folderName; folderName = pathParts[j]; ++j) {
      if (!subObj[folderName]) {
        subObj[folderName] = j < pathParts.length - 1 ? {} : null;
      }

      subObj = subObj[folderName];
    }
  }

  return tree_;
}

function render(object) {
  for (var folder in object) {
    if (!object[folder]) {
      var name = folder.trim();
      html_ += '<li class="file>' + folder + '</li>';
    } else {
      html_ += '<li class="folder">' + folder + '<ul>';
      render(object[folder]);
      html_ += "</ul>";
    }
  }
}

var html_ = [];
render(buildFromPathList(paths));
stevenferrer
  • 2,504
  • 1
  • 22
  • 33
user3143218
  • 1,738
  • 5
  • 32
  • 48
  • 1
    I've replaced my example after I saw your edit. It should be more than enough to get you started. Enjoy! – istos Oct 30 '14 at 06:06