ClojureScript中conj嵌套向量问题:如何生成扁平合并序列?
问题解决:Clojure中合并集合元素而非嵌套集合
问题原因
你遇到的问题核心是conj的行为逻辑:conj是给集合添加单个元素,当你传入(:countries list2)(一个向量)时,它会把这个向量整体当作一个元素插入原向量,而不是展开向量里的元素逐个添加,这就导致输出出现了嵌套的["AUS" "NZ"]。
而移除list2后正常,是因为此时你传给conj的是单个字符串元素"FRA",conj会直接把它加到原向量末尾,符合预期。
解决方案
有两种常用的解决方式,根据你的需求选择:
方案1:用into合并集合 + conj添加单个元素
into的作用是把第二个集合的所有元素逐个加入第一个集合,正好满足你合并两个向量的需求,之后再用conj添加单个元素:
(defn foo [] (->> (into (:countries list1) (:countries list2)) (conj (:countries list3)) (some-other-operations)))
方案2:用concat拼接所有序列再转向量
concat可以拼接多个序列的元素,注意要把单个元素"FRA"包装成一个序列(比如用[]),最后用vec转成你需要的向量类型:
(defn foo [] (->> (concat (:countries list1) (:countries list2) [(:countries list3)]) vec (some-other-operations)))
内容的提问来源于stack exchange,提问作者Navneet Singh
相关产品推荐
相关产品推荐

