假设您有一个存储有序树层次结构的平面表:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Run Code Online (Sandbox Code Playgroud)
这是我们所拥有的图表[id] Name
.根节点0是虚构的.
[0] ROOT / \ [1] Node 1 [3] Node 2 / \ \ [2] Node 1.1 [6] Node 1.2 [5] Node 2.1 / [4] Node 1.1.1
您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?
进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手.该表表示为结果集,可以随机访问.
伪代码或普通英语是可以的,这纯粹是一个概念性的问题.
额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?
编辑和补充
回答一个评论者(Mark Bessey的)问题:根节点不是必需的,因为它永远不会被显示.ParentId = 0是表示"这些是顶级"的惯例.Order列定义了如何对具有相同父节点的节点进行排序.
我所谈到的"结果集"可以被描绘成一组哈希图(保留在该术语中).因为我的例子意味着已经存在.有些答案会加倍努力并首先构建它,但那没关系.
树可以任意深.每个节点可以有N个子节点.不过,我并没有考虑到"数百万条目".
不要将我选择的节点命名('Node 1.1.1')误认为是依赖的东西.节点同样可以称为"Frank"或"Bob",不暗示命名结构,这只是为了使其可读. …
如果我在HTML页面中有一个非滚动标题,则固定在顶部,具有已定义的高度:
有没有办法使用URL锚点(#fragment
部分)让浏览器滚动到页面中的某个点,但是在没有JavaScript帮助的情况下仍然尊重固定元素的高度?
http://foo.com/#bar
Run Code Online (Sandbox Code Playgroud)
WRONG (but the common behavior): CORRECT: +---------------------------------+ +---------------------------------+ | BAR///////////////////// header | | //////////////////////// header | +---------------------------------+ +---------------------------------+ | Here is the rest of the Text | | BAR | | ... | | | | ... | | Here is the rest of the Text | | ... | | ... | +---------------------------------+ +---------------------------------+
两者有什么区别.我一直认为VBA是VB的某种"残缺"版本,但是当有一天朋友问我时,我不知道实际的差异是什么.
另外,当您使用Excel时,是VB还是VBA?
如果您正在VIM中编辑文件,然后需要打开现有缓冲区(例如,从缓冲区列表中)::buffers
如何在垂直拆分中打开它?
我知道你已经可以通过正常分割打开它,如:
:sbuffer N
Run Code Online (Sandbox Code Playgroud)
Wehere N
是您想要的缓冲区编号,但是,上面打开N
缓冲区水平而不是垂直.
我也知道你可以在打开后更改窗口位置,并像这样进行垂直分割:
Ctrl-W H
Ctrl-W L
Run Code Online (Sandbox Code Playgroud)
这会将窗口垂直分割为右侧或左侧.
在我看来,如果有一个sbuffer
应该有一个,vsbuffer
但不存在(不是我知道)
此外,请注意我不是在寻找一个插件来解决这个问题.我知道有很多插件可以让你这样做.
我相信我可能会遗漏已经存在的东西.
编辑:在最好的合作精神,我已经创建了一个简单的功能与映射如果其他人偶然发现这个问题,并且不想安装插件:
功能:
" Vertical Split Buffer Function
function VerticalSplitBuffer(buffer)
execute "vert belowright sb" a:buffer
endfunction
Run Code Online (Sandbox Code Playgroud)
制图:
" Vertical Split Buffer Mapping
command -nargs=1 Vbuffer call VerticalSplitBuffer(<f-args>)
Run Code Online (Sandbox Code Playgroud)
这完成了在右侧拆分中打开缓冲区的任务,因此对于缓冲区1,您可以将其称为:
:Vbuffer 1
Run Code Online (Sandbox Code Playgroud) 关于jQuery AJAX成功回调,我想循环遍历对象的结果.这是响应在Firebug中的显示方式的示例.
[
{"TEST1":45,"TEST2":23,"TEST3":"DATA1"},
{"TEST1":46,"TEST2":24,"TEST3":"DATA2"},
{"TEST1":47,"TEST2":25,"TEST3":"DATA3"}
]
Run Code Online (Sandbox Code Playgroud)
如何循环结果以便我可以访问每个元素?我尝试了类似下面的东西,但这似乎不起作用.
jQuery.each(data, function(index, itemData) {
// itemData.TEST1
// itemData.TEST2
// itemData.TEST3
});
Run Code Online (Sandbox Code Playgroud) 我是XSLT的新手,所以我对这两个标签感到有点困惑,
<xsl:apply-templates name="nodes">
Run Code Online (Sandbox Code Playgroud)
和
<xsl:call-template select="nodes">
Run Code Online (Sandbox Code Playgroud)
那么你能列出它们之间的区别吗?
是否有一种Railsy方式将\n转换为<br>
?
目前,我这样做:
mystring.gsub(/\n/, '<br>')
Run Code Online (Sandbox Code Playgroud) 对于一个穷人在客户端实现近似校正正确的排序,我需要一个JavaScript函数来在字符串中进行有效的单个字符替换.
这就是我的意思(请注意,这适用于德语文本,其他语言的排序方式不同):
native sorting gets it wrong: a b c o u z ä ö ü collation-correct would be: a ä b c o ö u ü z
基本上,我需要将所有出现的给定字符串的"ä"替换为"a"(依此类推).这样,本机排序的结果将非常接近用户期望的结果(或数据库将返回的内容).
其他语言有这样的设施:Python提供str.translate()
,在Perl中tr/…/…/
,XPath有一个函数translate()
,ColdFusion有ReplaceList()
.但是JavaScript呢?
这就是我现在所拥有的.
// s would be a rather short string (something like
// 200 characters at max, most of the time much less)
function makeSortString(s) {
var translate = {
"ä": "a", "ö": "o", "ü": …
Run Code Online (Sandbox Code Playgroud) 假设active是一个"boolean field"(小int,0或1)
# Find all active users
select * from users where active
# Find all inactive users
select * from users where NOT active
Run Code Online (Sandbox Code Playgroud)
换句话说,"NOT"运算符可以直接应用于布尔字段吗?
只想知道如何从XSLT中的子节点读取父节点的属性.码:
<A>
<b attr1="xx">
<c>
</c>
</b>
</A>
Run Code Online (Sandbox Code Playgroud)
XSLT:
<xsl:template match="c">
<xsl:value-of select="attribute of b node">
</xsl:template>
Run Code Online (Sandbox Code Playgroud)