【问题标题】:Creating Clojure vector(s) using values pulled from map(s) via keywords使用通过关键字从地图中提取的值创建 Clojure 向量
【发布时间】:2013-04-19 11:13:57
【问题描述】:

我有一个 Clojure 地图向量用作查找表:

(def data 
  [{map1},{map2},...,{nth-map}])

向量中的每个映射都包含两个键/值对:

{:key1 "Value1", :key2 "Value2"}

所以整个结构是这样的:

(def data
  [{:key1 "Value1-1", :key2 "Value2-1"}, ; map1
   {:key1 "Value1-2", :key2 "Value2-2"}, ; map2
                     |
                     |
                     V
   {:key1 "Value1-n", :key2 "Value2-n"}]) ; nth-map

我想将此迁移到数据库表中。我已经有一个将值插入表行的函数。它需要一个向量,向量中的每个项目代表行中的一列:

(defn insert-row [column1-value column2-value]
  (sql/with-connection (System/getenv "DATABASE_URL")
    (sql/insert-values
      :table                           ; table name
      [:column1 :column2]              ; table column names
      [column1-value column2-value]))) ; values to be inserted into row

我需要的是一个函数,它遍历整个地图矢量,并为每个地图创建一个仅包含该地图值的矢量:

[Value1 Value2]

我想我可以使用我现有的数据库函数insert-row 作为map 的参数:

(map insert-row values-from-map)

其中values-from-map 表示一个外部向量,其中包含原始向量中每个映射的内部向量(每个都包含其各自的值):

[[Value1-1 Value2-1]
 [Value1-2 Value2-2]
 [Value1-n Value2-n]]

这将获取创建的每个向量并将其传递给insert-values 函数。

我可以创建一个包含来自一个关键字的所有值的单个向量:

user=> (vec (map :key1 data))      
["Value1" "Value2" ... "nth=Value"]

如何创建包含所有内部向量的外部向量?

[[Value1-1 Value2-1][Value1-2 Value2-2]...[Value1-n Value2-n]]

【问题讨论】:

    标签: map vector clojure key-value


    【解决方案1】:
    user=> (vec (for [m data] ((juxt :key1 :key2) m)))
    [["Value1-1" "Value2-1"] ["Value1-2" "Value2-2"]]
    

    【讨论】:

    • 我比我更喜欢这个答案。 vals 不保证键的顺序,但您的代码保证它们按正确的顺序排列。
    • (map vals data) 似乎以预期顺序填充我的数据库。就我而言,这并不重要。但我喜欢这个版本在这方面更强大的事实。谢谢,米歇尔。
    【解决方案2】:

    假设您仍然将地图矢量定义为“数据”:

    (into [] (map #(into [] (vals %)) data))
    

    【讨论】:

    • 如果你真的需要一个向量的向量,那么使用(into [] (map #(into [] (vals %)) data))。不过,我认为您只需 (map vals data) 就可以了。
    • (map vals data) 正是我所需要的。此外,它就像我怀疑的那样简单得令人尴尬。非常感谢,WolfeFan。我仍在尝试围绕函数式编程。
    • 为什么不用mapv 而不是(into [] (map ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2020-09-09
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多