Clojure[Script]中Map对应JavaScript ...rest的等效实现方法问询
嘿,这个问题问得挺到位的!在Clojure和ClojureScript里,要实现类似JavaScript中Map解构的...rest剩余值提取效果,其实有几种实用的方法,我给你唠唠:
在Clojure[Script]中实现Map的剩余值提取(类似JS的...rest)
地道的Clojure/ClojureScript写法:用dissoc
因为Clojure和ClojureScript的Map都是不可变的,dissoc函数可以帮我们移除指定的键,返回的新Map就是我们要的「剩余部分」,完全对应JS里...rest的效果。
举个例子:
(def my-map {:a 1 :b 2 :c 3 :d 4}) ;; 提取:a和:b,剩下的存到rest-map里 (let [{:keys [a b]} my-map rest-map (dissoc my-map :a :b)] (println a b) ; 输出 1 2 (println rest-map)) ; 输出 {:c 3 :d 4}
如果需要提取的键比较多,还可以封装一个小函数来简化操作:
(defn map-rest [target-map keep-keys] (apply dissoc target-map keep-keys)) ;; 用法示例 (let [{:keys [a b]} my-map rest-map (map-rest my-map [:a :b])] ;; 这里就可以用rest-map做后续操作啦 )
ClojureScript专属:借助JS原生解构
如果你写的是ClojureScript,因为它最终编译成JavaScript,也可以直接利用JS的...rest解构特性,不过这种写法更偏向JS风格,不如dissoc地道:
(def my-js-map #js {:a 1 :b 2 :c 3 :d 4}) ;; 用JS原生解构提取剩余值,再转成ClojureScript的Map (let [{:keys [a b], :as rest-map} (js->clj (js* "{a, b, ...rest}" my-js-map))] (println a b) ; 输出 1 2 (println rest-map)) ; 输出 {:c 3 :d 4}
小提醒
Clojure的Map解构本身没有像Vector那样的& rest语法(毕竟Map是键值对集合,不是有序序列),所以dissoc是最符合Clojure哲学的实现方式,既简洁又保持了不可变数据的特性。
内容的提问来源于stack exchange,提问作者Sam R.
相关产品推荐
相关产品推荐

