建立一个网站(我是网络和Scala和Playframework的新手,但有很多编程经验)并试图打印出我的域模型的一部分。我有一个类别的域模型 - >目标 - >任务。任务知道目标和目标知道类别。现在我想像这样打印出来
Category1
Goal1
Activity1
Goal2
Activity2
Activity3
我使用Scala并完成了这项工作:
@tasks.groupBy(_.goal).map { case (goal, tasks) =>
<ul>
<li>@goal.name</li>
<ul>
@tasks.map { task =>
<li>@task.name</li>
}
</ul>
</ul>
}
所以现在按照这样排序:
Goal1
Activity1
Goal2
Activity2
Activity3
但我也想按类别排序,就像我展示的第一个例子。有没有一种很好的方法在Scala中执行此操作,还是应该更改我的域模型?
问候,莉娜
答案 0 :(得分:2)
您可以通过添加其他groupBy
来完成此操作:
tasks.groupBy(_.goal).groupBy { case (goal, _) => goal.category }
或等同地:
tasks.groupBy(_.goal).groupBy(_._1.category)
这只是获取您从当前方法获得的地图,并按目标键的类别对其进行分组,为您提供Map[Category, Map[Goal, Seq[Task]]]
,您可以这样使用:
<ul>
@tasks.groupBy(_.goal).groupBy(_._1.category).map { case (category, goals) =>
<li>@category.name
<ul>
@goals.map { case (goal, tasks) =>
<li>@goal.name
<ul>
@tasks.map { task => <li>@task.name</li> }
</ul>
</li>
}
</ul>
</li>
}
</ul>
请注意,我还调整了你的嵌套。
答案 1 :(得分:1)
我不确定这是最简单的方法,但是:
<ul>
@defining(tasks.map(_.goal.category).distinct) {categories =>
@categories.map{category =>
<li>
@category.name
</li>
<ul>
@tasks.filter(_.goal.category == category).groupBy(_.goal).map{ case (goal, tasks) =>
<ul>
<li>@goal.name</li>
<ul>
@tasks.map {task =>
<li>@task.name</li>
}
</ul>
</ul>
}
</ul>
}
}
</ul>
@defining
允许您定义值categories
,这是唯一类别的列表,这要归功于方法distinct
。