【问题标题】:Clojure perform map function on array elementsClojure 对数组元素执行映射功能
【发布时间】:2017-12-13 23:19:05
【问题描述】:

我已经定义了这样的人

(def persons 
  '({:id 1 :name "olle"} 
    {:id 2 :name "anna"} 
    {:id 3 :name "isak"} 
    {:id 4 :name "beatrice"}))

我想在这里映射类似这个命令的人的元素

(map :id persons)
(1 2 3 4)

但是,术语 :id 将像 [:id] 一样放在括号内。如何取消括号,以便

形式的函数
(map [:id] persons) 

表现与

相同
(map :id persons)

此外,如果数字以 :id 作为标题每列显示一个,那就太好了。

【问题讨论】:

  • 不能只取向量的第一个元素得到:id吗?
  • 嗯,我想是的,但我想这样做,这只是一个玩具问题。
  • 我需要在方括号前添加 at 符号之类的东西。
  • 没有办法让这两个表达式相等。您需要先处理该向量,然后再将其提供给map。如果向量中有超过 1 个键怎么办?你期望结果是什么?并展示您已经尝试过的内容,并具体描述您遇到的问题。目前范围很广。
  • (map (first [:id]) persons),它使用first“处理”向量。您不能只将密钥向量提供给 map 并尝试像您尝试的那样使用它。

标签: dictionary clojure


【解决方案1】:
(def persons
  '( {:id 1 :name "olle"}
     {:id 2 :name "anna"}
     {:id 3 :name "isak"}
     {:id 4 :name "beatrice"}))


(mapv (first [:id]) persons) => [1 2 3 4]

【讨论】:

    【解决方案2】:

    从 cmets 我假设您想按顺序提取一些键。这可以通过juxt 完成。例如:

    user=> (map (juxt :id :name) persons)
    ([1 "olle"] [2 "anna"] [3 "isak"] [4 "beatrice"])
    

    或者如果你真的需要一个向量,使用(apply juxt [:id :name])

    【讨论】:

      【解决方案3】:

      这是你想要的吗?

      (defn map' [keys records]
        (map #(select-keys % keys) records))
      
      (map' [:id] persons);;=>({:id 1} {:id 2} {:id 3} {:id 4})
      

      【讨论】:

        【解决方案4】:

        你的意思是数据结构看起来像这样吗?

        (def persons 
          '({[:id] 1 :name "olle"} 
            {[:id] 2 :name "anna"} 
            {[:id] 3 :name "isak"} 
            {[:id] 4 :name "beatrice"}))
        

        如果是,这段代码将解决问题:

        user=> (mapv #(get % [:id]) persons)
        [1 2 3 4]
        

        【讨论】:

          猜你喜欢
          • 2020-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-14
          • 1970-01-01
          相关资源
          最近更新 更多