【问题标题】:Map nested vector of array maps映射数组映射的嵌套向量
【发布时间】:2020-02-23 20:05:33
【问题描述】:

我一直在尝试将向量内的映射的嵌套值映射到向量的向量中,但没有成功。

我的数据是这样的:

[{:country {:name "chile", :id 1},
  :subcountries [{:name "talca", :id 2}
                 {:name "concepcion", :id 3}
                 {:name "puerto montt", :id 4}]}
 {:country {:name "united states", :id 5},
  :subcountries [{:name "boston", :id 6}
                 {:name "texas", :id 7}]}]

虽然我一直在使用的代码模糊地返回了我想要得到的结果的近似值:

(map
 (fn [x]
   (let [{{id :id name :name} :country
          subcountries :subcountries} x]
     [id
      name
      (map (fn [y] (let [{yid :id yname :yname} y] [yid yname])))]))
 data)

我收到的结果很奇怪,因为我想要的向量只是一个函数:

([1 "chile" #function[clojure.core/map/fn--5862]]
 [5 "united states" #function[clojure.core/map/fn--5862]])

我做错了什么?

预期的输出应该是这样的:

[[["chile" 1] ["talca" 2] ["concepcion" 3] ["puerto montt" 4]]
 [["united states" 5] ["boston" 6] ["texas" 7]]]

【问题讨论】:

  • 您希望显示的数据样本的输出是什么?
  • 对不起,没加,我加了...
  • 我真正想做的是将data 映射到option 标签的向量(clojure 脚本),使用name 作为inner textid 作为value 属性。

标签: clojure clojurescript


【解决方案1】:

您在向量输出中看到该函数的原因是您的内部 map 没有将该函数应用于任何数据结构,因此它返回了一个转换器。

在这里,我更新了内部 map 以将功能映射到子国家/地区,我认为这是您的意图。 (还有一个小错字,你用的是yname :yname 而不是yname :name

(defn f [data]
  (mapv
   (fn [x]
     (let [{{id :id name :name} :country
            subcountries :subcountries} x]
       [id
        name
        (mapv (fn [y] (let [{yid :id yname :name} y] [yid yname])) subcountries)]))
   data))

不确定这是否正是您想要的输出,因为您说“类似...”。如果没有,请告诉我们您是否需要更多帮助才能顺利完成。

> (f data)
[[1 "chile" [[2 "talca"] [3 "concepcion"] [4 "puerto montt"]]]
 [5 "united states" [[6 "boston"] [7 "texas"]]]]

【讨论】:

    【解决方案2】:

    这可能是一种更“Clojurey”的方式:

    (defn countries->vecs [data]
      (let [->pair (juxt :name :id)
            map->pairs (fn [{:keys [country subcountries]}]
                         (apply vector (->pair country) 
                                       (map ->pair subcountries)))]
        (mapv map->pairs data)))
    

    【讨论】:

    • ->pair 从地图中提取:name:id((juxt :name :id) {:name "chile", :id 1}) => ["chile" 1]map->pairs 为国家/地区地图生成对向量的向量。 (map->pairs {:country {:name "united states", :id 5}, :subcountries [{:name "boston", :id 6} {:name "texas", :id 7}]}) => [["united states" 5] ["boston" 6] ["texas" 7]]
    猜你喜欢
    • 2019-08-13
    • 2014-04-30
    • 2013-03-21
    • 1970-01-01
    • 2020-09-25
    • 2013-08-08
    • 2020-01-27
    • 2013-07-17
    • 2021-05-27
    相关资源
    最近更新 更多