...images
......|vertical
......|horizontal
...Jquery
......|UI
......|include
...quickfox
要处理的数组: 我有像上面那样的文件夹结构。它存储在数组目录中。见下文
var dirs = [
"images",
"images/vertical",
"images/horizontal",
"Jquery",
"Jquery/UI",
"Jquery/include",
"quickfox"
];
目标:如何制作如下的嵌套ul li。
<ul id="categorymenu">
<li>images </li>
<ul>
<li>vertical</li>
<li>horizontal</li>
</ul>
<li>Jquery</li>
<ul>
<li>UI</li>
<li>include</li>
</ul>
<li>quickfox</li>
</ul>
更新:XML结构
<directory name="images">
<file path="BBB.gif" width="500" height="282">BBB.gif</file>
<file path="AAA.jpg" width="964" height="525">AAA.jpg</file>
<directory name="images/vertical">
<file path="CCC.jpg" width="964" height="525">CCC.jpg</file>
</directory>
<directory name="images/horizontal">
<file path="DDD.jpg" width="964" height="525">DDD.jpg</file>
</directory>
</directory>
这是我从xml创建数组的地方..
$(document).ready(function () {
//------ READ XML -----------
$.ajax({
type: "GET",
url: "___deck.xml",
dataType: "xml",
success: function (data) {
my_xml = data;
xmlDirParser(my_xml);
}
});
//------ Get Files on List Change -----------
$("#dirlist").change(function () {
var folder = $(this).find('option:selected').text();
xmlFileParser(folder, my_xml);
});
});
function xmlDirParser(my_xml) {
$(my_xml).find('directory').each(function () {
var dirname = $(this).attr('name');
// $('#dirlist').append('<option value="1">'+dirname+'</option>');
//This is where I get dirs array
});
}
答案 0 :(得分:3)
数组的结构对于创建元素没有用,您可以基于数组创建对象并使用此对象。
var o = {};
// Creating an object based on the array elements
$.each(dirs, function (_, value) {
if (value.indexOf('/') === -1) {
o[value] = [];
} else {
var arr = value.split('/');
o[arr[0]].push(arr[1]);
}
});
// Creating elements
var html = '<ul id="categorymenu">';
for (key in o) {
html += '<li>' + key + '</li>';
if (o[key].length) {
html += '<ul><li>' + o[key].join('</li><li>') + '</li></ul>';
}
}
html += '</ul>';
<强>更新强>:
我没有注意到预期的标记无效,ul
元素应该只有li
个子元素,您应该将后代ul
元素添加到li
元素:
for (key in o) {
html += '<li>' + key ;
if (o[key].length) {
html += '<ul><li>' + o[key].join('</li><li>') + '</li></ul>';
}
html += '</li>';
}
html += '</ul>';
答案 1 :(得分:1)
原始回答
如果将数据结构更改为多维数组/对象,可以使用递归函数循环遍历无限嵌套级别,如下所示:
var dirs = [{
name: "images",
subdir: [{
name: "vertical"
}, {
name: "horizontal"
}]
}, {
name: "Jquery",
subdir: [{
name: "UI", subdir: [{name:'Nested 1',subdir: [{name:'Nested 2',subdir: [{name:'Nested 3'}]}]}]
}, {
name: "include"
}]
}, {
name: "quickfox"
}];
function createList( array){
var html='<ul>';
$.each( array, function(k, item){
html+='<li>'+item.name;
if( item.subdir){
html+=createList(item.subdir);
}
html+='</li>';
});
html+='</ul>';
return html;
}
$('body').html( createList( dirs))
DEMO:http://jsfiddle.net/AA6yb/1
已修订的答案
根据xml已经嵌套的更新信息,问题是如何解析xml而不是平面数组。
以递归方式循环遍历xml中children
的所有目录。通过使用find()
,您可以创建一个平面数组,因为find()
查找所有后代
function createList($xml) {
var html = '';
$xml.children('directory').each(function () {
var $dir = $(this);
var name= $dir.attr('name');
html += '<li class="dir">' + parseName($dir.attr('name'));
if ($dir.children().length) {
html += '<ul>';
$dir.children('file').each(function () {
html += '<li class="file">' + $(this).attr('path') + '</li>';
});
/* recursively loop through children directories of this directory*/
if( $dir.children('directory').length){
html+=createList($dir);
}
html += '</ul>';
}
});
html += '</li>';
return html;
}
function parseName( name){
if( name.indexOf('/')>-1){
return name.split('/').pop();
}else{
return name;
}
}
$('#directory_list').html(createList($(xmlData)))
HTML
<ul id="directory_list"></ul>
答案 2 :(得分:1)
如果您必须拥有此数据结构,则可以使用:
$(function () {
var dirs = [
"images",
"images/vertical",
"images/horizontal",
"Jquery",
"Jquery/UI",
"Jquery/include",
"quickfox"];
var rootList = $("<ul id='categorymenu'>").appendTo("body");
var elements = {};
$.each(dirs, function () {
var parent = elements[this.substr(0, this.lastIndexOf("/"))];
var list = parent ? parent.next("ul") : rootList;
var textMenu= parent ? this.split("/")[1] : this;
if (!list.length) {
list = $("<ul>").insertAfter(parent);
}
var item = $("<li>").appendTo(list);
$("<a>").text(textMenu).appendTo(item);
elements[this] = item;
});
});
这是一个小提琴:http://jsfiddle.net/K8SZk/3/