如何将 seq 转换为向量而不需要如此冗长?

问题描述 投票:0回答:2

我正在尝试为地图向量实现重新排序功能。现在,在处理嵌套向量等之前,我想了解如何在向量内移动未嵌套的项目。

正在尝试学习 clojure...

这是我的想法:

(defn split-at' [idx v]
  [(subvec v 0 idx) (subvec v idx)])

(defn my-reorder [lst start-pos end-pos]
  (let [item-to-move (get lst start-pos)
        spliced (remove-from-vec lst start-pos)
        [left-side right-side] (split-at' end-pos spliced)]
    (vec
      (flatten
        (conj [] (if (empty? left-side) [] left-side) item-to-move (if (empty? right-side) [] right-side)))
    )))

(my-reorder items 7 6)

如果我不进行整个检查和展平,我会得到向量包裹各种不需要的元素。 示例数据如下所示:

(def items [
         {:id "1" :text "HELLO I am First"}
         {:id "2" :text "RENDER IT!"}
         {:id "3" :children [{:id "4" :text "Im a child"}
                            {:id "5" :text "Im special!"}
                            {:id "6" :children [{:id 7 :text "I am so deep !!!"}]}]}
         {:id "8" :text "GoodBye I am last"}
         {:id "9" :children [{:id "10" :text "I am Number 10!"}]}
         {:id "13" :text "GoodBye I am last"}
          {:id "14" :text "GoodBye I am last"}
         {:id "15" :text "GoodBye I am last"}
         ])

有没有更简洁的方法来处理这个问题? 最终我想用新的顺序取回相同的向量。

我尝试在不进行嵌套 if 检查的情况下进行展平,并得到了混合结果。

clojure
2个回答
0
投票

问题的标题问的是一件事,但正文问的是另一件事。

如何将 seq 转换为向量而不需要如此冗长?

只需在 seq 上拨打

vec
即可。

如何在向量内移动未嵌套的项目

my-reorder
的签名和名字来看,你想要向量中的两个项目交换位置。

向量是关联集合,所以你可以像这样简单地做到这一点:

(defn my-reorder [v idx1 idx2]
  (assoc v idx1 (v idx2) idx2 (v idx1)))

0
投票

也许这样的东西会起作用:

(defn upd [from to data]
  (vec (mapcat (fn [i x] (cond (= i from) []
                               (= i to) [(data from) x]
                               :else [x]))
               (range)
               data)))

它只是通过索引集合,删除

from
处的项目,将其添加到以
to
索引开始的seq部分:

(upd 0 2 [1 2 3 4 5])
;; [2 1 3 4 5]

(upd 2 0 [1 2 3 4 5])
;; [3 1 2 4 5]
© www.soinside.com 2019 - 2024. All rights reserved.