5

对于我目前正在进行的一个项目,我得到了一个对象数组,每个对象都包含一个“内容”属性和一个“级别”属性。我需要将此列表转换为 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# 中实现了这个,但是另一种语言的示例/想法将非常受欢迎。

4

1 回答 1

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();
}
于 2012-08-16T18:12:29.490 回答