Skip to content

Commit d6b1b57

Browse files
TakaGototrptcolin
authored andcommitted
group-by function koan
1 parent f35e258 commit d6b1b57

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

resources/koans.clj

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,14 @@
209209
5
210210
:hello
211211
(6 :these :are)
212-
]}]]
212+
]}]
213+
["21_group_by" {"__" [odd?
214+
{5 ["hello" "world"] 3 ["foo" "bar"]}
215+
{1 [{:name "Bob" :id 1}
216+
{:last-name "Smith" :id 1}]
217+
2 [{:name "Mike" :id 2}]}
218+
nil
219+
{:nauty-list [{:name "Jimmy" :bad true}
220+
{:name "Joe" :bad true}]
221+
:nice-list [{:name "Jack" :bad false}]}]}]
222+
]

src/koans/21_group_by.clj

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
(defn get-odds-and-evens [coll]
2+
(let [{odds true evens false} (group-by __ coll)]
3+
[odds evens]))
4+
5+
(meditations
6+
7+
"To split a collection categorized by keys use the group-by function."
8+
(= __ (group-by count ["hello" "world" "foo" "bar"]))
9+
10+
11+
"Sometimes you want to filter a sequence but also keep the predicate."
12+
(= (get-odds-and-evens '(1 2 3 4 5))
13+
[[1 3 5] [2 4]])
14+
15+
"You can also group by a primary key"
16+
(= __
17+
(group-by :id [{:id 1 :name "Bob"}
18+
{:id 2 :name "Mike"}
19+
{:id 1 :last-name "Smith"} ]))
20+
21+
"but be careful when you group by non primary key"
22+
(= {"Bob" [{:name "Bob" :id 1}], "Mike" [{:name "Mike" :id 2}], __ [{:last-name "Smith" :id 1}]}
23+
(group-by :name [{:id 1 :name "Bob"}
24+
{:id 2 :name "Mike"}
25+
{:id 1 :last-name "Smith"}]))
26+
27+
"The true power of group-by is using a custom function"
28+
(= __
29+
(group-by #(if (:bad %) :nauty-list :nice-list)
30+
[{:name "Jimmy" :bad true}
31+
{:name "Jack" :bad false}
32+
{:name "Joe" :bad true}])))

0 commit comments

Comments
 (0)