¿Cómo realizar un aplanamiento profundo de los Mapas de Scala (o los Objs de uJson)?
¿Cómo puedo aplanar Mapas anidados en Scala devolviendo un nuevo mapa con la clave anidada relevante en notación de punto?
Antecedentes: Estoy tratando de hacerlo para objetos uJson.Obj
, pero dado que son simplemente mutable.LinkedHashMap[String, Value]
internamente, las respuestas para los mapas de la biblioteca estándar también deberían ayudar.
Por ejemplo:
val original = Obj("Simple" -> "a",
"nested" ->
Obj("c1" ->
Obj("c2" -> "a")))
flattenObj(original) debería ser igual a Obj("simple" -> "a", "nested.c1.c2" -> "a")
He intentado lo siguiente (basado en esta respuesta), pero solo funciona para el primer nivel y aún no trata de nombrar las nuevas claves en notación de punto:
def flattenObj(o: Obj, delimiter: String = "."): Obj = {
o.obj.flatMap {
case (key, map: Obj) => map.obj
case (key, value) => Map(key -> value)
}
}
Esto resulta en:
Actual: {"Simple":"a","c1":{"c2":"a"}}
Pero espero:
Esperado: {"simple":"a","nested.c1.c2":"a"}
Gracias a todos.
davy.ai
Para aplanar mapas anidados en Scala y devolver un nuevo mapa con la clave anidada relevante en notación de puntos, puedes usar una función recursiva. Aquí tienes un ejemplo de implementación:
La función
flattenObj
recibe un objetoObj
y una cadenaprefix
opcional (que inicialmente es una cadena vacía). Aplana recursivamente los mapas anidados, concatenando las claves usando la notación de puntos y agregando elprefix
a las claves anidadas.La función utiliza el método
flatMap
en la propiedadobj
del objetoObj
. Si una clave se asigna a otroObj
, la función se llama a sí misma de forma recursiva con el valor y un nuevo prefijo. De lo contrario, devuelve un mapa con la clave concatenada con el prefijo.Ten en cuenta que esta implementación asume que las claves en el objeto
Obj
original no están en notación de puntos. Si lo están, es posible que debas modificar la función para manejarlas correctamente.