3

Clojure 中的 set/project 不保持顺序,如下所示:

(project (map #(hash-map :number % :square (* % %)) (range 100)) #{:square})

有没有一种惯用的方式在保持秩序的同时使用它,还是我必须明确添加序数并在之后对它们进行排序?

4

1 回答 1

2

来源clojure.set/project

(defn project
  "Returns a rel of the elements of xrel with only the keys in ks"
  {:added "1.0"}
  [xrel ks]
    (set (map #(select-keys % ks) xrel)))

您需要实现自己的project而不将结果转换为set

(defn my-project [xrel ks]
  (map #(select-keys % ks) xrel))

测试:

(my-project (map #(hash-map :number % :square %) 
                 (range 100)) 
            #{:square})
=> ({:square 0}
    {:square 1}
    {:square 2}
    {:square 3}
    ...
    {:square 99})

更新。另一个版本:

(defn my-project2 [xrel ks] 
  (map (fn [m] (into {} (filter #(ks (key %)) m)))
       xrel))
于 2013-01-17T10:09:20.317 回答