0

首先我想说的是我是clojure新手,其次我想问你如何遍历一个map并在一个table中显示所有元素?这是我所做的。这是我的地图-

(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 |
+---------+---------+-------+-----+--------------------+-----+-----+---+

如何遍历地图并显示所有元素,而不仅仅是一个特定关键字?我可以以某种方式增加我的关键字值并像那样显示它吗?

4

1 回答 1

3

Maps 实现了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 可以做很多事情,序列 + 高阶函数是一个非常强大的组合。他们仍然解决了创建表格等实际问题!

于 2013-11-08T18:56:06.290 回答