首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中使用Specter删除嵌套值

在Clojure中使用Specter删除嵌套值
EN

Stack Overflow用户
提问于 2017-06-26 05:32:35
回答 7查看 906关注 0票数 4

假设我有一个如下所示的Clojure映射:

代码语言:javascript
复制
(def mymap {:a [1 2 3] :b {:c [] :d [1 2 3]}})

我想要一个remove-empties函数,它可以生成一个新的map,在这个map中,(:b mymap)中具有空序列作为值的条目将被删除。所以(remove-empties mymap)会给出值:

代码语言:javascript
复制
{:a [1 2 3] :b {:d [1 2 3]}}

有没有办法用Specter写一个函数来做这件事?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-06-26 15:23:20

代码语言:javascript
复制
(update my-map :b (fn [b]
                    (apply dissoc b 
                           (map key (filter (comp empty? val) b)))))
票数 3
EN

Stack Overflow用户

发布于 2018-01-05 08:31:02

下面是如何使用Specter实现这一点

代码语言:javascript
复制
(use 'com.rpl.specter)

(setval [:b MAP-VALS empty?] NONE my-map)
=> {:a [1 2 3], :b {:d [1 2 3]}}

在英语中,意思是“在:b下,找到所有为empty?的映射值。将它们设置为NONE,即删除它们。”

票数 5
EN

Stack Overflow用户

发布于 2017-06-29 14:29:04

这是specter的解决方案:

代码语言:javascript
复制
(ns myns.core
  (:require
   [com.rpl.specter :as spc]))

(def my-map
  {:a [1 2 3]
   :b {:c []
       :d [1 2 3]}})

(defn my-function
  [path data]
  (let [pred #(and (vector? %) (empty? %))]
    (spc/setval [path spc/MAP-VALS pred] spc/NONE data)))

;; (my-function [:b] my-map) => {:a [1 2 3]
;;                               :b {:d [1 2 3]}}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44750837

复制
相关文章

相似问题

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