You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:41:10