我怎样才能在数组地图上保持秩序?数组-长度大于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}发布于 2014-10-14 00:27:08
更新:
在第2371版中,对cljs.core/array-map的非高阶调用由一个宏支持,该宏为>8个键值对生成散列映射。有关票证+补丁,请参见CLJS-873。
(原答覆如下。)
最有可能的解释是,您是在REPL上这样做的。ClojureScript的标准REPL是在( Clojure )命名空间cljs.repl中实现的,它通过从JS环境接收返回值的字符串表示形式来操作,读取它们以生成Clojure数据并再次将它们打印出来。请参阅ClojureScript的源代码中的src/clj/cljs/pl.clj第156行 (链接到第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确实会产生预期的结果。
https://stackoverflow.com/questions/26349324
复制相似问题