通过地图迭代并显示表格

时间:2013-11-08 18:18:35

标签: clojure tabular

我想说的第一件事是我是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 |
+---------+---------+-------+-----+--------------------+-----+-----+---+

如何迭代地图并显示所有元素,而不仅仅是特定关键字的元素?我可以以某种方式增加我的关键字值并显示它吗?

1 个答案:

答案 0 :(得分:3)

地图实施Seq界面,这意味着您可以使用所有这些有用的高阶函数,例如mapfilterreduce,...来处理它们。这里的重要部分是地图的顺序表示由[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可以做很多事情,序列+高阶函数是一个非常强大的组合。他们仍然解决了创建桌子等实际问题!