首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Specter递归地变异映射中的值

用Specter递归地变异映射中的值
EN

Stack Overflow用户
提问于 2020-04-05 05:24:48
回答 2查看 278关注 0票数 3

这里是完全的克洛尔新手。这是一个简单的问题,但我似乎听不懂:

考虑到我有一个嵌套的未知深度的hasmap,如何使用斯佩克特变换()来变异数据结构的值?我想这里需要一个递归路径,但我无法让它工作.一个有用的例子就是我想要的,不幸的是,在文档中没有一个。

(递归映射上有一个用于set-val的示例,但我不知道如何将它转换为转换用例)

编辑:更多的细节被请求,所以在这里:我感兴趣的是一个转换表单,它可以改变嵌套映射的所有值--任意深度)。例如,此转换将能够增加下列映射(以及任何其他嵌套映射)中的所有值:

代码语言:javascript
复制
{:a 1 :b {:c 2 :d {:e 3}}} 
AND
{:a 1 :b {:c 2}}
AND
{:a 1}

我感兴趣的代码行可能如下所示:

代码语言:javascript
复制
(transform <missing selector here> inc data)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-05 14:00:39

使用链接示例

(def映射节点(递归路径[] p)(如果路径映射?)(继续-当时-停留地图-VALS p)

代码语言:javascript
复制
(transform [MAP-NODES MAP-VALS number?] inc data)
票数 2
EN

Stack Overflow用户

发布于 2020-04-05 14:53:13

一定要经常学习Clojure CheatSheet。对于这么简单的事情,只使用clojure.walk/postwalk可能是最简单的

代码语言:javascript
复制
(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require [clojure.walk :as walk]))

(dotest
  (let [data   {:a 1 :b {:c 2 :d {:e 3}}}
        result (walk/postwalk (fn [item]
                                (if (int? item)
                                  (inc item)
                                  item))
                 data)]
    (is= result {:a 2, :b {:c 3, :d {:e 4}}})))

对于更高级的问题,您可能对函数与父母同行感兴趣,它允许您检查从根节点到当前节点的路径上的所有项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61038426

复制
相关文章

相似问题

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