Clojurescript数组映射顺序

时间:2014-10-13 21:41:11

标签: clojure clojurescript

如何在数组映射中保持顺序?长度大于8的数组映射在Clojure和Clojurescript中表现完全不同。例如:

cljs

(array-map :a true :c true :d false :b true :z false :h false
           :o true :p true :w false :r true :t false :g false)
-> {:o true, :p true, :r true, :t false, :w false, :z false, :a true, :b true, :c true, :d false, :g false, :h false}

CLJ

(array-map :a true :c true :d false :b true :z false :h false
           :o true :p true :w false :r true :t false :g false)
-> {:a true :c true :d false :b true :z false :h false :o true :p true :w false :r true :t false :g false}

1 个答案:

答案 0 :(得分:2)

更新

从版本2371开始,对cljs.core/array-map的非高阶调用由宏支持,该宏为>发出哈希映射。 8个键值对。有关票证+补丁,请参阅CLJS-873


(原始答案如下。)

最可能的解释是你在REPL这样做。 ClojureScript的标准REPL(在(Clojure)命名空间cljs.repl中实现)通过接收来自JS环境的返回值的字符串表示来操作,读取它们以生成Clojure数据并再次打印出来。请参阅ClojureScript资源中的line 156 of src/clj/cljs/repl.clj(链接到版本2371)。

当在REPL上输入的表达式的返回值是一个大数组映射 - 或一个有序映射,或一个data.avl有序映射时 - 读取它的字符串表示将在Clojure端产生一个哈希映射。毋庸置疑,当打印此哈希映射时,原始排序将丢失。

要确认这是否确实发生了什么,请尝试在REPL中执行此操作(在当前结帐时从ClojureScript REPL会话中复制并粘贴):

ClojureScript:cljs.user> (array-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14)
{1 2, 3 4, 5 6, 7 8, 9 10, 11 12, 13 14}
ClojureScript:cljs.user> (array-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18)
{7 8, 1 2, 15 16, 13 14, 17 18, 3 4, 11 12, 9 10, 5 6}
ClojureScript:cljs.user> (seq (array-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18))
([1 2] [3 4] [5 6] [7 8] [9 10] [11 12] [13 14] [15 16] [17 18])
ClojureScript:cljs.user> (hash-map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18)
{7 8, 1 2, 15 16, 13 14, 17 18, 3 4, 11 12, 9 10, 5 6}

请注意,在数组映射上调用seq会产生预期的结果。