我想说的第一件事是我是clojure的新手,其次我想问你如何遍历地图并显示表格中的所有元素?这就是我所做的。 这是我的地图 -
(def kvote(assoc kvote (keyword kljuc){:id id :liga liga :dan dan :cas cas :domaciTim domaciTim :gostujuciTim gostujuciTim :par par :konacanIshod{:1 jedinica :x nerijeseno :2 dvojka}}))
我正在使用cldwalker表函数并执行此操作...
(table [ ["liga" "dan" "cas" "id" "par" "1" "X" "2"] [(:liga(get kvote(keyword :101)))
(:dan(get kvote(keyword :101)))
(:cas(get kvote(keyword :101)))
(:id(get kvote(keyword :101)))
(:par(get kvote(keyword :101)))
(get-in kvote [:101 :konacanIshod :1])
(get-in kvote [:101 :konacanIshod :x])
(get-in kvote [:101 :konacanIshod :2])
]] )
结果是这样的......
+---------+---------+-------+-----+--------------------+-----+-----+---+
| liga | dan | cas | id | par | 1 | X | 2 |
+---------+---------+-------+-----+--------------------+-----+-----+---+
| Serie A | nedelja | 20:00 | 101 | Bologna - Cagliari | 1.5 | 2.3 | 4 |
+---------+---------+-------+-----+--------------------+-----+-----+---+
如何迭代地图并显示所有元素,而不仅仅是特定关键字的元素?我可以以某种方式增加我的关键字值并显示它吗?
答案 0 :(得分:3)
地图实施Seq
界面,这意味着您可以使用所有这些有用的高阶函数,例如map
,filter
,reduce
,...来处理它们。这里的重要部分是地图的顺序表示由[key value]
向量组成,例如:
(seq {:a 0 :b 1})
;; => ([:a 0] [:b 1])
(map (fn [x] (inc (second x))) {:a 0 :b 1})
;; => (1 2)
(如果您不知道map
& co。做什么,请阅读它们 - 您会爱上它们(最终)!)
现在,在您的情况下,您似乎只对值感兴趣,而不是键,所以vals
会为您检索它们:
(vals {:a 0 :b 1})
;; => (0 1)
(map inc (vals {:a 0 :b 1}))
;; => (1 2)
但是,您的值是地图本身,您希望访问所述地图中的某些键并将它们放入单个矢量/列表中。你可以做到!
(map
(fn [x]
[(:key-1 x) (:key-2 x) ...])
(vals your-map-of-maps))
这看起来很单调乏味。但是创建内部结果只不过是在哈希映射中查找键的列表(!)中的每一个,所以另一个用例用于花哨的高阶map
:
(map
(fn [x]
(map (fn [k] (k x)) [:key-1 :key-2 ...]))
(vals your-map-of-maps))
现在,实际上Clojure可以很容易地将不同的函数(关键字是函数!)应用于相同的值以获得结果列表 - juxt
就是它所谓的,获取一系列函数并生成一个新的一个完全按我刚才描述的那样。
(def inc-and-dec (juxt inc dec))
(inc-and-dec 1)
;; => [2 0]
我们在这里寻找地图:
((juxt :a :b) {:a 0 :b 1 :c 2})
;; => [0 1]
好的,这需要处理很多,但如果您了解它为您提供的工具,您将只能使用Clojure高效工作 - 而更高级别的功能可能是您最常使用的功能。最后,让我们创建一个表:
(table
(cons
["header-1" "header-2" ...]
(map (juxt :key-1 :key-2 ...) (vals your-map-of-maps))))
现在是大结局,使用线程宏进行清理!
(->> your-map-of-maps
(map (juxt :key-1 :key-2 ...))
(cons ["header-1" "header-2" ...])
(table))
是的,Clojure可以做很多事情,序列+高阶函数是一个非常强大的组合。他们仍然解决了创建桌子等实际问题!