Gor*_*vic 9 clojure outer-join
与此问题类似:内部加入clojure
是否有任何Clojure库中的地图集合执行外连接(左,右和完全)的功能?
我想这可以通过修改代码来完成,clojure.set/join但这似乎是一个很常见的要求,因此检查它是否已经存在是值得的.
像这样的东西:
(def s1 #{{:a 1, :b 2, :c 3}
{:a 2, :b 2}})
(def s2 #{{:a 2, :b 3, :c 5}
{:a 3, :b 8}})
;=> (full-join s1 s2 {:a :a})
;
; #{{:a 1, :b 2, :c 3}
; {:a 2, :b 3, :c 5}
; {:a 3, :b 8}}
Run Code Online (Sandbox Code Playgroud)
左右外连接的适当函数,即包括nil左,右或两侧的连接键没有值(或值)的条目.
Sean Devlin(Full Disclojure成名)table-utils具有以下连接类型:
它暂时没有更新,但工作在1.3,1.4和1.5.要使它在没有任何外部依赖性的情况下工作:
fn-tuple为juxt(:use )ns 替换ns声明中的整个子句(require [clojure.set :refer [intersection union]])或
(defn map-vals
[f coll]
(into {} (map (fn [[k v]] {k (f v)}) coll)))
Run Code Online (Sandbox Code Playgroud)
或者对于Clojure 1.5及以上版本
(defn map-vals
[f coll]
(reduce-kv (fn [acc k v] (assoc acc k (f v))) {} coll))
Run Code Online (Sandbox Code Playgroud)
该库的用法是连接类型,两个集合(两组映射,如上例,或两个sql结果集)和至少一个连接fn.由于关键字是地图上的函数,通常只有连接键才足够:
=> (full-outer-join s1 s2 :a :a)
({:a 1, :c 3, :b 2}
{:a 2, :c 5, :b 3}
{:b 8, :a 3})
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,Sean试图在不久前将table-utils用于contrib,但这种情况从未解决过.太糟糕了,它从来没有得到它自己的项目(在github/clojars上).Stackoverflow或Clojure Google小组会不时出现像这样的库的问题.
另一种选择可能是使用datomic中的数据记录库来查询clojure数据结构.Stuart Halloway 在他的要点中有一些 例子.
| 归档时间: |
|
| 查看次数: |
1663 次 |
| 最近记录: |