Ho una serie di matrici che rappresentano i percorsi del file system, quindi ogni valore successivo è in realtà una directory più profonda, ad esempio:
var a1 = ["Desktop", "Pictures", "Summer 2011"];
è l'equivalente di
Desktop
|-Pictures
|-Summer 2011
Sto cercando un modo elegante per:
-
Appiattisci / unisci tutti i diversi array che devo creare con un oggetto / dizionario / array multidimensionale.
-
Analizza il risultato e rendi nidificato
UL
(elenco html) alla pagina che rappresenta correttamente la gerarchia. -
Scrivi ciò che ho già in un modo più "OOP" ..
Ho già una versione funzionante:
<!DOCTYPE html>
<html>
<head></head>
<body onload="init()">
<ul id="tree"></ul>
<script>
var a = [ "Desktop", "Folder1", "InnerFolder1" ];
var b = [ "Desktop", "Folder1", "Inner 2" ];
var c = [ "Documents", "Folder 2", "InnerFolder1", "even deepper" ];
var d = [ "Something Else", "Folder1", "Inner 2" ];
var all = [a, b, c, d];
var Tree = {};
var ul = document.getElementById("tree");
function init(){
for ( var i = 0; i < all.length; i++ ){
addToTree(Tree, all[i] );
}
createList(Tree, ul);
}
//function from http://stackoverflow.com/questions/3663096/how-to-convert-array-to-tree
function addToTree(tree, array) {
for (var i = 0, length = array.length; i < length; i++) {
tree = tree[ array[i] ] = tree[ array[i] ] || {};
}
}
function createList( obj, _pushTo ){
for ( attr in obj ){
var _doIHaveChildren = function ( ){
for(var prop in obj[attr]) {
if (obj[attr].hasOwnProperty(prop)) {
return true;
}
}
return false;
}
var li = document.createElement("li");
li.id = attr.toString();
li.innerHTML = attr.toString();
if ( Tree.hasOwnProperty(attr) ){
ul.appendChild(li);
} else {
_pushTo.appendChild(li);
}
if ( _doIHaveChildren() === true ){
var ul2 = document.createElement("ul");
li.appendChild(ul2);
}
createList( obj[attr], ul2 );
}
}
</script>
</body>
</html>
Grazie!
EDIT:
Sto iniziando dalle stringhe che rappresentano i percorsi, vale a dire "Desktop/Pictures/Summer 2011"
, che sono danneggiati dagli array.