如何在clojure中创建动态地图?

如何在clojure中创建动态地图?,clojure,Clojure,我想创建一个像这样的地图 {:a 1 :b 2 ;;in some condition :c 3 ;;in some other condition } 但是我不知道如何在map结构中将类似[:b2]的列表更改为:b2 以下是我尝试过的一些错误案例: {:a 1 (if (is condition1) [:b 2]) (if (is condition2) [:c 3]) ;... } {:a 1 (map indentity (if (is condition1) [:b

我想创建一个像这样的地图

{:a 1 
 :b 2 ;;in some condition
 :c 3 ;;in some other condition
}
但是我不知道如何在map结构中将类似
[:b2]
的列表更改为
:b2

以下是我尝试过的一些错误案例:

{:a 1
 (if (is condition1) [:b 2])
 (if (is condition2) [:c 3])
 ;...
}


{:a 1 
 (map indentity (if (is condition1) [:b 2]))
 (map indentity (if (is condition2) [:c 2]))
 ;;...
}
我所尝试的都将返回一个序列,而不是参数


有没有一种不用宏的处理方法?

这里有一种方法:

(fn [cond1 cond2]
  (into
   {:a 1}
   (map
    (fn [[c e]] (when c e))
    [[cond1 [:b 2]] [cond2 [:c 3]]])))

您可能希望传入一个与条目对关联的条件表

这里有一种方法:

(fn [cond1 cond2]
  (into
   {:a 1}
   (map
    (fn [[c e]] (when c e))
    [[cond1 [:b 2]] [cond2 [:c 3]]])))
(into {} [{:a 1}
          (if (is condition1) [:b 2])
          (if (is condition2) [:c 3])])
您可能希望传入一个与条目对关联的条件表

(into {} [{:a 1}
          (if (is condition1) [:b 2])
          (if (is condition2) [:c 3])])
这是因为如果
is condition 1
为false,则
if
表达式将返回
nil
,这将被地图上的
conj
忽略


这是因为如果
is condition 1
为false,则
if
表达式将返回
nil
,这被地图上的
conj
忽略。

我认为
merge
是一个不错的选择

(merge {:a 1}
     (if condition1 {:b 2})
     (if condition2 {:c 3}))

我认为
merge
是一个不错的选择

(merge {:a 1}
     (if condition1 {:b 2})
     (if condition2 {:c 3}))

要回答您最初的问题,即向地图添加一对
[:b2]
,只需使用
conj

user> (conj {:a 1} [:b 2])
{:b 2, :a 1}
现在,如果只想在条件(谓词)为true时添加一对,则可以使用一个函数,例如:

(defn conj-if-value-is-positive [m kv-pair]
  (if (< 0 (second kv-pair))
     (conj m kv-pair)
     m))

user> (conj-if-value-is-positive {:a 1} [:b 2])
{:b 2, :a 1}
[:d-1]
未添加到映射,因为它不符合条件。 事实上,函数
conj if value positive
不是很通用,可以分解为单独的步骤:

  • 根据条件筛选对
  • 将结果累积到地图中
  • e、 g


    在您的示例中,您希望在不同的对上使用不同的条件。这可以通过减少一系列
    [[key-value]谓词]
    来实现

    要回答您最初的问题,即向地图添加一对
    [:b2]
    ,您只需使用
    conj

    user> (conj {:a 1} [:b 2])
    {:b 2, :a 1}
    
    现在,如果只想在条件(谓词)为true时添加一对,则可以使用一个函数,例如:

    (defn conj-if-value-is-positive [m kv-pair]
      (if (< 0 (second kv-pair))
         (conj m kv-pair)
         m))
    
    user> (conj-if-value-is-positive {:a 1} [:b 2])
    {:b 2, :a 1}
    
    [:d-1]
    未添加到映射,因为它不符合条件。 事实上,函数
    conj if value positive
    不是很通用,可以分解为单独的步骤:

  • 根据条件筛选对
  • 将结果累积到地图中
  • e、 g


    在您的示例中,您希望在不同的对上使用不同的条件。这可以通过减少一系列
    [[key-value]谓词]
    来实现

    什么是操作员
    ?@缩略图我不知道,问OP.vOv操作员
    ?@缩略图我不知道,问OP.vOv