- 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/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!