【发布时间】:2017-08-21 20:32:24
【问题描述】:
我正在尝试从嵌套数据结构中获取值的索引路径。
我写了一些代码,但它不能正常工作
(defn helper
[val form c index]
(loop [f form
i index
l 0]
(if (seq f)
(if (or (list? (first f)) (vector? (first f)))
(helper val (first f) (conj c l) (inc i))
(if (= val (first f))
(conj c l)
(recur (rest f) (inc i) (inc l))))
nil)))
(defn find-indexes
[val form c index]
(when (seq form)
(if-let [result (helper val form c index)]
result
(find-indexes val (rest form) c (inc index)))))
(defn find-index-route
[val form]
(find-indexes val form [] 0))
当前行为:
(find-index-route :my-key '(1 2 ("a" :my-key))) ;=> [2 1] "Works"
(find-index-route :my-key '(1 2 ("a" ["b" 3 :my-key]))) ;=> [2 1 2] "Works"
(find-index-route :my-key '(1 2 ("a" ["b" 3 () :my-key]))) ;=> nil "Does NOT Work"
(find-index-route :my-key '(1 2 ("a" [] ["b" 3 :my-key]))) ;=> nil "Does NOT Work"
(find-index-route :my-key '(1 2 [] ("a" ["b" 3 :my-key]))) ;=> [0 1 2] "It has to be [3 1 2]"
问题是,如果函数在找到返回值之前命中空列表或向量,则返回nil 或0(仅针对第一级)
我需要的行为:
;=> [indexes...]
(find-index-route :my-key '(1 2 :my-key)) ;=> [2]
(find-index-route :my-key '(1 2 "a" :my-key "b")) ;=> [3]
(find-index-route :my-key '(1 2 [:my-key] "c")) ;=> [2 0]
(find-index-route :my-key '(1 2 [3 [:my-key]])) ;=> [2 1 0]
(find-index-route :my-key '(1 2 [3 [[] :my-key]])) ;=> [2 1 1]
(find-index-route :my-key '(1 2 [3 [4 5 6 (:my-key)]])) ;=> [2 1 3 0]
(find-index-route :my-key '(1 2 [3 [[]]])) ;=> nil or []
【问题讨论】:
-
这个问题在问什么?什么是“索引路线”?为什么
:my很特别?你输入的结构是什么?您的预期输出是什么意思?正如所写,这个问题是无法回答的。 -
@amalloy 编辑的问题,现在更清楚了吗?
-
请包含您尝试的实际代码。
...并不能说服我们您实际上尝试过任何东西。 -
@NathanDavis 我已经添加了我的实际代码。
标签: clojure