根据字符串输入生成嵌套的 HTML 列表.香草JS
Generating nested HTML list, based on string input. Vanilla JS
我在生成动态嵌套列表时遇到了一个算法问题。在输入时,我得到一个这样的字符串数组:
["A"、"A"、"/B"、"//C"、"/B"、"//C"、"A"、"A"]
每个"/"都是层次结构中的下一级,它是最后一个元素的直接子元素,具有较少的"/"符号。具有相同数量的"/"符号的元素位于同一级别。
['A'、'//C'] 或 ['//C'] 等输入无效。
结果应该是层次结构中的 HTML 列表一个一个-B--C-B--C一个一个
到目前为止,这就是我所做的:https://jsfiddle.net/k18Lbou7/
function createList(depth, elements, iterator, parentElement) {
var newDepth = 0;
for(var i=iterator; i<elements.length; i++) {
var match = elements[i].text.match(/^'s*('/+)/);
if(match == null) {
newDepth = 0;
} else {
newDepth = match[0].length;
}
if (depth == newDepth-1) {
var nestedList = document.createElement('ul');
parentElement.lastChild.appendChild(nestedList);
createList(newDepth, elements, i, nestedList);
} else if (depth == newDepth) {
var nextElement = document.createElement('li');
var span = document.createElement('span');
span.innerHTML = elements[i].text;
nextElement.appendChild(span);
parentElement.appendChild(nextElement);
}
}
}
var value = ['Home', '* This is active', '/This is dropdown', '// shhh...', '/ we ♥ you', '//Last one', 'Last one', 'Last one']
.map(function(pLine) {
return {
'text': pLine,
'page_id': null
};
});
var listElement = document.createElement('ul');
createList(0, value, 0, listElement);
document.body.appendChild(listElement);
关键是我正在复制一些键,或者避免以不同的方法使用最后一个元素。
也许有人可以帮助mi发现不良结果的原因或建议解决此功能的不同方法。
非常感谢您的帮助!
好的,我做了id。这是一个答案。
function createList(elements, parentElement) {
var parentsList = [parentElement];
var depth = 0;
elements.forEach(function(item) {
var match = item.text.match(/^'s*('/+)/);
if(match) {
depth = match[0].length;
} else {
depth = 0;
}
var listElement = document.createElement('li');
var span = document.createElement('span');
span.innerHTML = item.text
listElement.appendChild(span);
if (parentsList.length-1 == depth) {
parentsList[parentsList.length-1].appendChild(listElement);
} else if (parentsList.length-1 < depth) {
var parentListElement = document.createElement('ul');
parentListElement.appendChild(listElement);
parentsList[parentsList.length-1].appendChild(parentListElement);
parentsList.push(parentListElement);
} else {
while (parentsList.length-1 > depth) {
parentsList.pop();
}
parentsList[parentsList.length-1].appendChild(listElement);
}
});
}
var el = document.createElement('ul');
var value = ['Home', '* This is active', '/This is dropdown', '// shhh...', '/ we ♥ you', '//Last one', 'asd', '/Last one', 'Last one']
.map(function(pLine) {
return {
'text': pLine,
'page_id': null
};
});
createList(value, el);
document.body.appendChild(el);
相关文章:
- 如何在HTML列表中添加事件's子弹
- html5中数据描述属性中的html列表
- JSON编码一个HTML列表——所有子项都显示在所有父项上
- 处理html列表中的javascript对象
- 使用JSON和JavaScript添加额外的html列表元素
- jQuery,CSS:自动着色HTML列表
- 将 json 数据追加到 HTML 列表框
- JavaScript将缩进文本转换为HTML列表重复顶层<李>'s为<ul>'s
- 我如何用css或javascript订购这样的html列表
- 让Angular.js显示json数据的html列表
- 选中的Angular HTML列表将所选值放入应用程序范围的变量和跨度中
- 显示或隐藏基于复选框数据的 HTML 列表,Laravel 4
- 使用 javascript 编辑 HTML 列表条目
- Html列表:如何计算列表中检索到的参数数
- 无法在jQuery上对我的html列表进行排序
- 动态将项目添加到 HTML 列表
- 垂直滚动的 HTML 列表
- jQuery:将 JSON-Object 转换为 HTML 列表改进
- 如何通过自动填充html列表为用户制作搜索字段
- 在 HTML 列表中计算直接子项