首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否从映射中删除nil值?

是否从映射中删除nil值?
EN

Stack Overflow用户
提问于 2010-10-15 05:15:59
回答 9查看 22.4K关注 0票数 36

我有一个可能包含nil值的Clojure map,我正在尝试编写一个函数来删除它们,但没有太多成功(我是新手)。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
(def record {:a 1 :b 2 :c nil})
(merge (for [[k v] record :when (not (nil? v))] {k v}))

这会产生一系列的映射,这并不是我期望从merge中得到的:

代码语言:javascript
代码运行次数:0
运行
复制
({:a 1} {:b 2})

我想要:

代码语言:javascript
代码运行次数:0
运行
复制
{:a 1, :b 2}
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-10-15 06:37:32

for列表理解返回一个映射列表,因此您需要将此列表作为可选参数应用于merge函数:

代码语言:javascript
代码运行次数:0
运行
复制
user> (apply merge (for [[k v] record :when (not (nil? v))] {k v}))
{:b 2, :a 1}      

更简洁的解决方案是将map过滤为一个序列并连接到一个map中:

代码语言:javascript
代码运行次数:0
运行
复制
user> (into {} (filter second record))
{:a 1, :b 2}  

不要删除false值:

代码语言:javascript
代码运行次数:0
运行
复制
user> (into {} (remove (comp nil? second) record))
{:a 1, :b false}  

使用dissoc实现持久数据共享,而不是创建一个全新的map:

代码语言:javascript
代码运行次数:0
运行
复制
user> (apply dissoc                                                                                            
       record                                                                                                  
       (for [[k v] record :when (nil? v)] k))
{:a 1, :b 2}  
票数 63
EN

Stack Overflow用户

发布于 2014-03-05 09:30:52

下面是一个在嵌套地图上工作的方法:

代码语言:javascript
代码运行次数:0
运行
复制
(defn remove-nils
  [m]
  (let [f (fn [[k v]] (when v [k v]))]
    (postwalk (fn [x] (if (map? x) (into {} (map f x)) x)) m)))
票数 9
EN

Stack Overflow用户

发布于 2015-12-11 18:53:48

@Eelco答案的一个变体:

代码语言:javascript
代码运行次数:0
运行
复制
(defn remove-nils [m]
  (let [f (fn [x]
            (if (map? x)
              (let [kvs (filter (comp not nil? second) x)]
                (if (empty? kvs) nil (into {} kvs)))
              x))]
    (clojure.walk/postwalk f m)))

根据@broma0的观点,它消除了任何空的映射。

代码语言:javascript
代码运行次数:0
运行
复制
user> (def m {:a nil, :b 1, :c {:z 4, :y 5, :x nil}, :d {:w nil, :v nil}})
user> (remove-nils m)
{:b 1, :c {:z 4, :y 5}}
user> (remove-nils {})
nil
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3937661

复制
相关文章

相似问题

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