【问题标题】:Clojure: How to collapse nested maps with a specific key?Clojure:如何使用特定键折叠嵌套地图?
【发布时间】:2012-03-08 20:55:55
【问题描述】:

我正在尝试清理 Clojure 中的一些 JSON 数据。 JSON 文档中的一些值被封装在具有关联(不再需要)元数据的对象中。我从一个 JSON 文档开始,例如:

{ "household": {
    "address": {
        "street": { "value": "123 Fire Ln", "foo": "bar1" },
        "zip": { "value": "01234", "foo": "bar2" }
    },
    "persons": [
        {
            "id": "0001",
            "name": { "value": "John Smith", "foo": "bar3" }
        },
        {
            "id": "0002",
            "name": { "value": "Jane Smith", "foo": "bar4" }
        }
    ]
} }

我使用 Cheshire 解析这个 JSON 并得到以下数据结构:

{ "household" {
    "address" {
        "street" {"value" "123 Fire Ln", "foo" "bar1"},
        "zip" {"value" "01234", "foo" "bar2"}
    },
    "persons" [
        {"id" "0001", "name" {"value" "John Smith", "foo" "bar3"}}
        {"id" "0002", "name" {"value" "Jane Smith", "foo" "bar4"}}
    ]
} }

我的目标是用“value”键“折叠”这些嵌套映射,删除“foo”关联,并将值分配给更高一级的映射键(例如,“street”、“zip”、“姓名”)。生成的数据结构如下所示:

{ "household" {
    "address" {
        "street" "123 Fire Ln",
        "zip" "01234"
    },
    "persons" [
        {"id" "0001", "name" "John Smith"}
        {"id" "0002", "name" "Jane Smith"}
    ]
} }

这里的任何帮助都会很棒,谢谢!

【问题讨论】:

    标签: clojure


    【解决方案1】:

    听起来像是clojure.walk/postwalk 的工作!

    (defn collapse [obj]
      (postwalk (fn [obj]
                  (or (and (map? obj)
                           (get obj "value"))
                      obj))
                obj))
    

    您实际上可以大大缩短此时间,因为get 愿意处理非地图对象(它只返回nil),但我认为第一个版本中发生的事情要清楚得多。

    (defn collapse [obj]
      (postwalk #(get % "value" %) obj))
    

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2014-05-10
      • 2016-11-14
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多