You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure如何仅合并两个哈希映射中共同存在的键?

在Clojure中合并两个哈希映射并仅保留共同键

嘿,刚接触Clojure的话确实会对这些集合操作有点懵,不过这个需求其实很容易实现,我给你一步步拆解下:

首先,我们先明确需求:取两个哈希映射中同时存在的键,然后把这些键对应的键值对合并成一个新映射(注意:如果同一个键在两个映射里值不同,merge会用后面映射的值覆盖前面的,这个逻辑可以根据你的需求调整)。

具体实现步骤

  1. 先定义两个示例哈希映射:
(def map1 {:a 1 :b 2 :c 3})
(def map2 {:b 20 :c 30 :d 40})
  1. 获取两个映射的共同键:
    我们需要先把每个映射的键转成集合,再求集合的交集:
(def common-keys (clojure.set/intersection (set (keys map1)) (set (keys map2))))
;; 执行后common-keys的值是 #{:b :c}
  1. 筛选并合并共同键的键值对:
    用select-keys从原映射中筛选出共同键对应的条目,再用merge合并:
(merge (select-keys map1 common-keys) (select-keys map2 common-keys))
;; 执行结果是 {:b 20, :c 30} —— 因为map2的键值对在merge时覆盖了map1的

简化成通用函数

如果需要多次使用这个逻辑,可以封装成一个函数:

(defn merge-common-keys [map1 map2]
  (let [common (clojure.set/intersection (set (keys map1)) (set (keys map2)))]
    (merge (select-keys map1 common) (select-keys map2 common))))

;; 调用示例
(merge-common-keys map1 map2) ;; 返回 {:b 20, :c 30}

小提示

如果你希望保留第一个映射的键值(而不是被后面的覆盖),只需要调整merge里的顺序:

(merge (select-keys map2 common-keys) (select-keys map1 common-keys))
;; 结果会变成 {:b 2, :c 3}

内容的提问来源于stack exchange,提问作者Rattus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:32:04