0

如何在 Scala 中展平深度嵌套的地图,以点表示法返回具有相关嵌套键的新地图?

背景:我正在尝试为uJson.Objs 这样做,但由于它们只是mutable.LinkedHashMap[String, Value]底层,标准库地图的答案也应该有所帮助。

例如:

   val original = Obj("Simple" -> "a",
        "nested" ->
          Obj("c1" ->
            Obj("c2" -> "a")))
   
   flattenObj(original) shouldEqual Obj("simple" -> "a", "nested.c1.c2" -> "a")

我已经尝试了以下(基于this answer),但它仅适用于第一级,并且仍然不处理以点表示法命名新键:

    def flattenObj(o: Obj, delimiter: String = "."): Obj = {
      o.obj.flatMap {
        case (key, map: Obj) => map.obj
        case (key, value) => Map(key -> value)
      }
    }

结果是:

Actual: {"Simple":"a","c1":{"c2":"a"}}

但是,我希望:

Expected: {"simple":"a","nested.c1.c2":"a"}

谢谢你们。

4

1 回答 1

0

基于@Raf 在评论中的指导的最终实施:

  def flattenObj(o: Obj, keyAcc: String = "", delimiter: String = "."): Obj = {
    o.obj.flatMap(kv => {
      val key: String = if (keyAcc.isEmpty) kv._1 else keyAcc + delimiter + kv._1

      kv._2 match {
        case map: Obj => flattenObj(map.obj, key, delimiter).obj
        case value => Map(key -> value)

      }
    })
  }

谢谢拉夫。_

于 2021-12-21T16:54:48.703 回答