功能测试值在一系列值和返回值中

时间:2016-07-30 19:18:32

标签: javascript clojure clojurescript

我是clojure脚本的新手,我正试图将以下函数覆盖到clojurescript中

function getLengthAtPoint(pt){
        var i = 0;
    while(i < p.getTotalLength())
    {
        var xy = p.getPointAtLength(i);
      // console.log(i, xy);
        if(Math.round(xy.y) == pt[1] && Math.round(xy.x) == pt[0])
      {
            return i;
      }

      i++;
    }

    return 0;
 }

我有以下逻辑

(defn get-length-at-point
  [p pt]
  (doseq [
     i (range (.getTotalLength p))
    :let [xy (.getPointAtLength p i)]
    :when (and (= (round js/Math (first xy)) (first pt)) (= (round js/Math (last xy)) (last pt)))]
    i)
  0)

但我认为我在这里可能错了,因为:什么时候不会返回i呢?

更新

想出了这个

(defn get-length-at-point
  [pt {p :path}]
  (loop [i 0]
    (let [point (.getPointAtLength p i)]
    (cond
       (and (= (.round js/Math (.-x point)) (.round js/Math (:x pt)))
       (= (.round js/Math (.-y point)) (.round js/Math (:y pt)))) i
       (>= i (.getTotalLength p)) 0
        :else (recur (inc i))
       ))))

如果有人知道更简单的方法请分享

1 个答案:

答案 0 :(得分:2)

目前还不完全清楚你要在这里计算什么,但这是你要追求的目标之一:

(defn get-length-at-point
  [pt p]
  (->> (map #(.getPointAtLength p %) (range (.getTotalLength p)))
       (filter (fn [point] (and (= (.round js/Math (.-x point)) (.round js/Math (:x pt)))
                                (= (.round js/Math (.-y point)) (.round js/Math (:y pt))))))
       (count)))

惯用语Clojure代码通常会避免loop map所做的事情。 doseq仅针对副作用运行,不会向您返回值。大多数时候,Clojure代码也不使用索引。如果您使用更多上下文更新帖子以了解您要执行的操作以及可以在p上调用哪些功能,我们可能会提供更多帮助。