是否有一种惯用的方法在Clojure中的地图中找到匹配的键和值?

鹰眼

我正在尝试从地图中找到匹配的键和值对。我正在使用以下代码:

(defn matches? [m k v]
  (let [val (k m)]
    (= val v)))

my-demo.core=> (matches? {:a 1 :b 2} :b 2)
true
my-demo.core=> (matches? {:a 1 :b 2} :b 3)
false

另一种使用方法superset?

my-demo.core=> (superset? #{:a 1 :b 3} #{:a 1})
true
my-demo.core=> (superset? #{:a 1 :b 3} #{:a 2})
false

我觉得有更好的方法可以做到这一点。

我的问题是:是否有一种惯用的方法在Clojure中的地图中找到匹配的键和值?

快棕色狐狸

这可能是一个很小的问题,您可以只使用它而不是定义一个函数:

(= ({:a 1 :b 2} :a)
   1)

=> true

我想说这是一种惯用的方式,对于大多数用例都可以正常工作。


但是,这取决于测试nil时所需的行为因为上述方法将返回true:c nil

(= ({:a 1 :b 2} :c)
   nil)

=> true

而且您的函数的行为方式相同:

(matches? {:a 1 :b 2} :c nil)

=> true

为了解决这个问题,您可以使用get“未找到”值:

(= (get {:a 1 :b 2} :c ::not-found)
   nil)

=> false

这可以正常工作,但可能不那么整洁。您只需要确保您的“未找到”值永远不会与测试值相同。


如果您想真正地知道一个映射包含一个可能带有nil的键,则您必须检查这两项。这是一个仅执行一次哈希映射查找就可以执行此操作的函数。它使用(find map key)which返回键的映射条目(键-值对),如果键不存在,则返回nil。

(defn contains-kv? [m k v]
  (if-let [kv (find m k)]
    (= (val kv) v)
    false))

(contains-kv? {:a 1 :b nil} :a 1)
=> true

(contains-kv? {:a 1 :b nil} :b nil)
=> true

(contains-kv? {:a 1 :b nil} :c nil)
=> false

注意:我不认为superset?您在做您想做的事。在该示例中,您使用的是集合,而不是完全不同的哈希映射:

(clojure.set/superset? #{:a 1 :b 2} #{:a :b})

=> true

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

找到一种将匹配的键和值从映射推回向量的方法

Clojure对装饰者是否有一种有效的惯用方法?

是否有一种惯用的方法让(辅助)构造函数派生出Kotlin中主要构造函数的值?

F#中是否有一种以Clojure方式提取记录成员的值的方法?

是否有一种优雅的方法来更改Clojure映射的键?

Vue.js 是否有一种优雅的方式来循环 axios 中的地图键?

如何在 Clojure 中的一系列向量中找到然后更新地图中的值?

有没有一种优雅的方法来检查对象中是否存在键和值,然后使用它?

是否有一种方法可以将未知大小的 dict 的键和值连接到 JS 中的字符串中?

在golang中,有一种从地图中获取值切片的好方法吗?

有没有一种方法可以在每行中打印一个键和字典的值?

phpunit中是否有一种方法可以断言数组中某个键的两个值?

有没有一种方法可以检查单击的按钮的textContent是否与数组中的任何值匹配?

是否有一种惯用的方式来建立一个以变量名作为键,值作为值的字典?

是否有一种方法可以从每个项目的多个实例的矩阵中找到最少的唯一实体?

如何在Scala的地图中找到(键,值)对的数量?

有没有一种方法可以完全匹配ColdFusion中的“真实”和“假”值

是否存在一种在没有 Prelude 和模式匹配的情况下在 Haskell 中声明反向函数的方法?

有没有一种方法可以在AGM地图中设置边界和缩放级别?

有没有一种优雅的方法可以在python中的多层列表中找到一个项目

如何在颤振中的两张地图中找到匹配值?

在 Python 3.9.2 中,是否有一种紧凑的方法可以删除嵌套字典中的键?

有没有一种方法可以从python中的字符串中找到关键字

是否有一种算法可以匹配opencv中的缩放比例和旋转rotateRect

有没有一种方法可以从值中访问键?

有没有一种方法可以强制子值具有与对象的键匹配的字段?

是否有某种方法可以在 Typescript 的界面中的键之间建立一种关系?

是否有一种更优雅的解决方案来填充地图中的列表?

是否有一种惯用的方式来交换单元阵列中的两个元素?