在play框架中提交重复的表单字段时,值将被提交为
Map("name"->List("value0", "value1", "value2"))`.
Run Code Online (Sandbox Code Playgroud)
我需要将这些转换为
Map("name[0]"->"value0", "name[1]"->"value1", "name[2]"->"value2"))
Run Code Online (Sandbox Code Playgroud)
用于映射到案例类.
我的测试类如下:
@RunWith(classOf[JUnitRunner])
class TranslateMapSuite extends FunSuite {
test("Translate Map "){
val inputMap = Map("name"->List("value0", "value1", "value2"))
val outputMap = TranslateMap.translate(inputMap)
assert(outputMap == Map("name[0]"->"value0", "name[1]"->"value1", "name[2]"->"value2"))
}
Run Code Online (Sandbox Code Playgroud)
我已经提出了以下可行的解决方案,但我对此并不满意:
object TranslateMap{
def translate(inputMap:Map[String, List[String]]) = {
inputMap.map ( {
case (key, listValue) => {
var i = -1
listValue.map (value=> {
i +=1
(key +"[" + i+"]", value)
})
}
})
}.head.toMap
}
Run Code Online (Sandbox Code Playgroud)
任何有关改进代码的建议都将非常感激.
这是一个更惯用的版本:
def translate(orig: Map[String, List[String]]) =
orig.flatMap {
case (k, vs) => vs.zipWithIndex.map {
case (v, i) => "%s[%d]".format(k, i) -> v
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用for-comprehension 编写稍微简洁(但等效)的版本:
def translate(orig: Map[String, List[String]]) = for {
(k, vs) <- orig
(v, i) <- vs.zipWithIndex
} yield "%s[%d]".format(k, i) -> v
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |