代码之家  ›  专栏  ›  技术社区  ›  Jdv

将贴图M转换为贴图A数组,其中M中的键和值映射到A中元素中的新键

  •  1
  • Jdv  · 技术社区  · 6 年前

    给出这样的地图:

    {
     "keystring1" "valuestring1"
     "keystring2" "valuestring2"
     ...
    }
    

    如何将其转换为一组地图,如下所示:

    [
     {
      :newKey1 "keystring1"
      :newKey2 "valuestring1"
     }
     {
      :newKey1 "keystring2"
      :newKey2 "valuestring2"
     }
     ...
    ]
    

    根据我的研究,我假设 reduce-kv assoc 在这里应该很有用,但我还不能创建一个工作版本。

    到目前为止,我得到的结论是:

     (reduce-kv (fn [m k v]
       (merge m (assoc {} :newkey1 k) (assoc {} :newkey2 v)))
       []
       {"keystring1" "valuestring1", "keystring2" "valuestring2"})
    

    其结果是:

    [{:newkey1 "keystring1"} {:newkey2 "valuestring1"} {:newkey1 "keystring2"} {:newkey2 "valuestring2"}]
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   jas    6 年前

    我喜欢使用 for 对于这样的事情。

    (def m {"keystring1" "valuestring1"
            "keystring2" "valuestring2"})
    
    > (for [[k v] m]
        {:newkey1 k
         :newkey2 v})
    
    ({:newkey1 "keystring1", :newkey2 "valuestring1"}
     {:newkey1 "keystring2", :newkey2 "valuestring2"})
    

    如果确实需要,可以将其强制为向量:

    > (vec (for [[k v] m]
             {:newkey1 k
              :newkey2 v}))
    
    [{:newkey1 "keystring1", :newkey2 "valuestring1"}
     {:newkey1 "keystring2", :newkey2 "valuestring2"}]
    
        2
  •  2
  •   Taylor Wood    6 年前

    下面是一个使用 reduce-kv :

    (def my-map
      {"keystring1" "valuestring1"
       "keystring2" "valuestring2"})
    
    (reduce-kv
      (fn [acc k v] (conj acc {:newKey1 k :newKey2 v}))
      []
      my-map)
    

    或使用 zipmap :

    (mapv #(zipmap [:newKey1 :newKey2] %) my-map)
    

    两者都产生以下效果:

    => [{:newKey1 "keystring1", :newKey2 "valuestring1"}
        {:newKey1 "keystring2", :newKey2 "valuestring2"}]
    
        3
  •  1
  •   leetwinski    6 年前

    还有一个,为了完整性:

    user> (map (partial zipmap [:new-key1 :new-key2]) data)
    
    ;;=> ({:new-key1 "keystring1", :new-key2 "valuestring1"} 
    ;;    {:new-key1 "keystring2", :new-key2 "valuestring2"})
    

    user> (map zipmap (repeat [:new-key1 :new-key2]) data)
    
    ;;=> ({:new-key1 "keystring1", :new-key2 "valuestring1"} 
    ;;    {:new-key1 "keystring2", :new-key2 "valuestring2"})