对于我正在处理的项目,我给出了一个对象数组,每个对象都包含一个“content”属性和一个“level”属性。我需要将此列表转换为HTML项目符号列表。例如,如果给出了以下输入(为简单起见,以JSON显示):
[ {content: "Hey", level: "1"},
{content: "I just met you", level: "2"},
{content: "and this is crazy", level: "2"},
{content: "but here's my number", level: "1"},
{content: "call me, maybe", level: "3"} ]
我需要将其转换为以下XHTML:
<ul>
<li>Hey</li>
<li>
<ul>
<li>I just met you</li>
<li>and this is crazy</li>
</ul>
</li>
<li>but here's my number</li>
<li>
<ul>
<li>
<ul>
<li>call me, maybe</li>
</ul>
</li>
</ul>
</li>
</ul>
最终产品看起来像这样:
有点怪异的谜题。关于最有效/易于实现的算法/方法的任何建议?我在C#中实现这一点,但是另一种语言的示例/想法将非常受欢迎。
答案 0 :(得分:2)
这里的想法是,只要级别大于或等于前一级,它就应该嵌套,如果它更小,则应该关闭。
public string BuildLists(List<KeyValuePair<string, int>> pairs)
{
int CurrentLevel = 1;
StringBuilder s = new StringBuilder();
s.Append("<ul>");
foreach (KeyValuePair<string, int> pair in pairs)
{
if(pair.Value > CurrentLevel)
{
//Nest more
for(int i = 0; i < pair.Value - CurrentLevel; i++)
{
s.Append("<li><ul>");
}
}
else if(pair.Value < CurrentLevel)
{
//Close Tags
for(int i = 0; i < CurrentLevel - pair.Value; i++)
{
s.Append("</ul></li>");
}
}
s.Append("<li>" + pair.Key + "</li>");
CurrentLevel = pair.Value
}
//Close everything.
for(int i = 0; i < CurrentLevel - 1; i++)
{
s.Append("</ul></li>");
}
s.Append("</ul>");
return s.ToString();
}