首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojurescript Array-映射顺序

Clojurescript Array-映射顺序
EN

Stack Overflow用户
提问于 2014-10-13 21:41:10
回答 1查看 929关注 0票数 2

我怎样才能在数组地图上保持秩序?数组-长度大于8的数组映射在Clojure和Clojurescript中的行为完全不同。示例:

cljs

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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}
EN

回答 1

Stack Overflow用户

发布于 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会话中复制和粘贴)上这样做:

代码语言:javascript
复制
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确实会产生预期的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26349324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档