首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure:如何使用特定的键折叠嵌套映射?

Clojure:如何使用特定的键折叠嵌套映射?
EN

Stack Overflow用户
提问于 2012-03-09 04:55:55
回答 1查看 1.1K关注 0票数 6

我正在尝试清理Clojure中的一些JSON数据。JSON文档中的一些值被封装在带有相关(不再需要的)元数据的对象中。我从如下所示的JSON文档开始:

代码语言:javascript
复制
{ "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,并获得了以下数据结构:

代码语言:javascript
复制
{ "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“键”折叠“那些嵌套的map,删除"foo”assoc,并将值分配给更高一级的map key (例如,"street","zip","name")。结果数据结构将如下所示:

代码语言:javascript
复制
{ "household" {
    "address" {
        "street" "123 Fire Ln",
        "zip" "01234"
    },
    "persons" [
        {"id" "0001", "name" "John Smith"}
        {"id" "0002", "name" "Jane Smith"}
    ]
} }

如果能帮上忙就太好了,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-09 06:21:34

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

代码语言:javascript
复制
(defn collapse [obj]
  (postwalk (fn [obj]
              (or (and (map? obj)
                       (get obj "value"))
                  obj))
            obj))

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

代码语言:javascript
复制
(defn collapse [obj]
  (postwalk #(get % "value" %) obj))
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9624800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档