- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试以 HTML ul
列表方式显示 JavaScript 对象。该对象表示二叉树并具有以下格式:
{
"val":2,
"l":{
"val":1,
"l":{},
"r":{}
},
"r":{
"val":4,
"l":{},
"r":{
"val":5,
"l":{},
"r":{}
}
}
}
我需要完成的结果是这样的:
<ul>
<li>
<a href="#">2</a>
<ul>
<li>
<a href="#">1</a>
</li>
<li>
<a href="#">4</a>
<ul>
<li>
<a href="#">5</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
我在这里写这段代码是为了得到相应的结果字符串,但它没有生成正确的结果。
function buildList(data){
var html = '';
if(data.val){
if(data.l){
html += '<ul>';
html += buildList(data.l);
}
html += '<li>';
html += '<a href="#">' + data.val + '</a>'
html += '</li>';
if(data.r){
html += buildList(data.r);
html += '</ul>';
}
}
return html;
}
任何猜测或线索将不胜感激。
最佳答案
让生活更轻松
在这种情况下,一点点数据抽象会走很长的路。如果您尝试在单个函数中处理数据中的所有差异,您将面临一大堆单分支 if
和其他副作用代码。
使用下面的数据抽象,我将复杂的逻辑和条件简化为单个 if/else
语句。我将逐步执行代码,然后在最后将它们放在一个可运行的演示中
一厢情愿
我不想考虑(例如)val 是否为 {}
或者 l
或 r
是否具有有效值- 这对我来说毫无意义。我想写的是这样的:
const makeTree = ({val, l, r}) => {
if (val === undefined)
return []
else
return [Node('ul', Node('li', Link('#', val)), ...makeTree(l), ...makeTree(r))]
}
这假设我们有两个构造函数 Node
和 Link
可供我们使用。但在我们深入研究之前,我们看到 makeTree
无论如何都会返回一个数组。所以我们必须想出一个很好的面向用户的功能,以某种方式为我们将其构建到 HTML 中。那将是 makeMenu
- 它所做的一切都是从数组中取出根节点并调用 .toElem()
const makeMenu = data =>
makeTree(data)[0].toElem()
这也帮助我们知道我们需要 .toElem
在两种节点类型 Node
和 Link
上可用。看,用一厢情愿的想法构建你的程序很好,因为你想要的每一步都会告诉你接下来你必须构建的东西。
Node
和 Link
构造函数
现在让我们敲击 Node
和 Link
。他们非常直截了当。 Node
只是一个特定 type
的通用 HTML 元素,它获取应用于它的子元素;请注意,每个 child 都应该有一个 .toElem
方法。 Link
只需要一个 href
和一些 text
并构造具有相应属性集的元素。
const Node = (type, ...children) => ({
toElem: () => {
const elem = document.createElement(type)
children.forEach(child => elem.appendChild(child.toElem()))
return elem
}
})
const Link = (href, text) => ({
toElem: () => {
const elem = document.createElement('a')
elem.setAttribute('href', href)
elem.textContent = text
return elem
}
})
将它们放在一起
const Node = (type, ...children) => ({
toElem: () => {
const elem = document.createElement(type)
children.forEach(child => elem.appendChild(child.toElem()))
return elem
}
})
const Link = (href, text) => ({
toElem: () => {
const elem = document.createElement('a')
elem.setAttribute('href', href)
elem.textContent = text
return elem
}
})
const makeTree = ({val, l, r}) => {
if (val === undefined)
return []
else
return [Node('ul', Node('li', Link('#', val)), ...makeTree(l), ...makeTree(r))]
}
const makeMenu = data =>
makeTree(data)[0].toElem()
const data = { "val": 2, "l": { "val": 1, "l": {}, "r": {} }, "r": { "val": 4, "l": {}, "r": { "val": 5, "l": {}, "r": {} } } }
document.body.appendChild(makeMenu(data))
关于javascript - 递归地在 ul 列表中显示 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43550223/
我正在尝试使用 jQuery 来提交一个基本的 Accordion 样式菜单。 这是菜单: http://www.cybart.com/bscg/ 这是为其提供 Accordion 功能的代码片段:
这是我的网站: http://www.simply-a-christian.com/index.html 在导航栏上,如果您移动到: 信念 玛丽安教义 您可以看到每个 Marian Dogma(列出了
这可能是一个很容易回答的问题,但是,我找不到解决方案。我已经建立了一个非常简单的菜单,每当我将鼠标悬停在 ul 父项上时,它的子项 ul ul 就会变得可见。基本上它是有效的,但 parent 让位于
这是一张图片: 问题是(你可以看到):“页面”按钮太低,无法点击。我想要的是它应该靠近“联系人”。 现在是代码: HTML Home About
我有一个这样的嵌套 ul 列表: Subcat Subcat2
如果标题不好理解,我来解释一下... 我有一个 css/jquery 切换菜单。按“+”号时它变大,按“-”号时它变小。我使几个元素的填充、边距和高度在切换/单击时发生变化。菜单顶部充满了链接,然后当
我正在尝试创建一个列表,该列表会在单击上/下时更改它的第一个元素。 This is what i want to do. 此代码运行良好。但问题是我也在我网站的主菜单中使用列表,并且这段代码也在我的主
我需要使用水平缩放的 ul > li > ul 的组合来创建一个菜单。每个 ul 都应该有一个 max-height 并在溢出时滚动。悬停在 li 上时,如果里面有另一个 ul 标签,它应该会在右侧打
我正在 ul 中编写 ul 来制作 Accordion 式菜单。但是当我在 html 验证器中检查下面的代码时,它给了我这些错误 Element ul not allowed as child of
我有两个列表,第二个列表是可排序的,我可以从第一个列表拖动到第二个列表,但不知道如何从第一个列表中删除。 如果我删除 helper: "clone" ,该项目 (li) 会被删除,但拖放操作效果不佳(
JSFiddle 问题:https://jsfiddle.net/td6szj3o/ /我有一个 ul li,每个 li 都有标准文本项。该列表是动态的,因此有时每个内容 li 小于其所在容器的 wi
我有两个元素 - 一个在另一个里面。问题是第二个元素显示在第一个 ul li 元素的顶部。 HTML: Home Merchants
我有一些结构如下的菜单: First level link 1 Child link 1 Child link 2
我有很长的ul,李的数目不是恒定的 1 2 3 4 5 6 7 8 9 我想使用Moovweb SDK将其分为两个ul。 1 2 3 4
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我有一棵信息“树”,显示在许多嵌套列表中(ul li ul li ....)。两个问题: 当我点击时,父 ul 和子 ul 都会切换。 如果我点击在其中没有 ul 的嵌套列表中(例如,下面的 Cran
我正在尝试在 jQuery 中创建以下内容: 我有一个项目列表(例如 10 个)。如果项目数超过 6,则将剩余项目(从 6 到 10)复制到新的 UL 中以创建下拉菜单结构。 菜单的第一个版本是 ht
嘿大家 - 我在工作中尝试 jquery 的第二天,有点卡住了。 我有一个无序列表的链接..在无序列表的链接中 点击 ,我想要的 child 变得可见。 点击(文档上的任何位置)后,我想要 child
嗨,这就是我想要实现的目标。我有一个 ID="columns"的 div,在本例中我有 3 列,但可能会有更多或更少...我正在使用 JQuery 动态添加列表项。
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Using .after() to add html closing and open tags 我想显示高度几乎相
我是一名优秀的程序员,十分优秀!