我正在尝试为地图向量实现重新排序功能。现在,在处理嵌套向量等之前,我想了解如何在向量内移动未嵌套的项目。
正在尝试学习 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 检查的情况下进行展平,并得到了混合结果。
问题的标题问的是一件事,但正文问的是另一件事。
如何将 seq 转换为向量而不需要如此冗长?
只需在 seq 上拨打
vec
即可。
如何在向量内移动未嵌套的项目
从
my-reorder
的签名和名字来看,你想要向量中的两个项目交换位置。
向量是关联集合,所以你可以像这样简单地做到这一点:
(defn my-reorder [v idx1 idx2]
(assoc v idx1 (v idx2) idx2 (v idx1)))
也许这样的东西会起作用:
(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]