Scala 表达式中的多个字段

Scala 表达式中的多个字段,scala,map,Scala,Map,给定一个JsObject列表,我想将其转换为Map[String,JsValue],然后遍历每个Map的键值对,每对生成一个JsObject。最后,我想将所有这些JsObject放入一个列表[JsObject] 下面是我对for表达式的尝试 def getObjMap(obj: JsObject): Option[Map[String, JsValue]] = obj match { case JsObject(fields) => Some(fields.toMap) ca

给定一个
JsObject
列表,我想将其转换为
Map[String,JsValue]
,然后遍历每个Map的键值对,每对生成一个JsObject。最后,我想将所有这些JsObject放入一个
列表[JsObject]

下面是我对for表达式的尝试

def getObjMap(obj: JsObject): Option[Map[String, JsValue]] = obj match { 
   case JsObject(fields) => Some(fields.toMap)
   case _ => None
}

def createFields(x: (String, JsValue)): JsObject = Json.obj("n" -> x._1, 
                                                            "v" -> x._2)    
val objects: List[JsObject] = foo()

val res: List[JsObject] = for {
                            obj <- objects
                            map <- getObjMap(obj)
                            mapField <- map
                          } yield(createFields(mapField))

我认为问题的根源在于这样一个事实,即for construction从处理一个列表开始,然后最终处理一个选项(从
getObjMap
)。结构的类型需要在整个过程中保持不变,以便理解。对
getObjMap
调用的结果调用
.toList
,可以解决以下问题:

val res: List[JsObject] = for {
                            obj <- objects
                            map <- getObjMap(obj).toList
                            mapField <- map
                          } yield(createFields(mapField))
val res:List[JsObject]=for{

obj谢谢,我会试试。顺便说一句,我的代码看起来怎么样?是idomatic还是垃圾?我能做得更好吗?那很有效,谢谢,阴影地带。我没有包括它,但我有我的
createFields(…)
函数包含第三个字段(
l
(行号))其中,对于对象中的每个obj,我需要增加一个行号。目前,我在
getObjMap(…
)方法的开头增加了行号。如何在for表达式中仍然使用增加的行号?
val res: List[JsObject] = for {
                            obj <- objects
                            map <- getObjMap(obj).toList
                            mapField <- map
                          } yield(createFields(mapField))