cljs.reader / read-string以随机顺序读取对象的内容

时间:2019-10-10 22:14:23

标签: clojurescript edn

我不明白为什么cljs.reader / read-string函数以随机顺序读取我edn文件的内容。这是一个示例文件内容:

{:data
 {:name-tit
  {:hu "Név"
   :en "Name"}

  :description-tit
  {:hu "Leírás"
   :en "Description"}

  :short-description-tit
  {:hu "Rövid leírás"
   :en "Short description"}

  :title-tit
  {:hu "Cím"
   :en "Title"}

  :label-tit
  {:hu "Címke"
   :en "Label"}

  :color-tit
  {:hu "Szín"
   :en "Color"}

  :color-gradient-tit
  {:hu "Színátmenet"
   :en "Color gradient"}

  :link-tit
  {:hu "Link"
   :en "Link"}

  :target-tit
  {:hu "Link target"
   :en "Link target"}

  :weight-tit
  {:hu "Tömeg"
   :en "Weight"}

  :length-tit
  {:en "Length"
   :hu "Hossz"}

  :width-tit
  {:en "Width"
   :hu "Szélesség"}

  :height-tit
  {:en "Height"
   :hu "Magasság"}}}

这是read-string函数的输出:

{:data {:weight-tit {:hu "Tömeg", :en "Weight"}, :color-tit {:hu "Szín", :en "Color"}, :height-tit {:en "Height", :hu "Magasság"}, :short-description-tit {:hu "Rövid leírás", :en "Short description"}, :label-tit {:hu "Címke", :en "Label"}, :link-tit {:hu "Link", :en "Link"}, :title-tit {:hu "Cím", :en "Title"}, :name-tit {:hu "Név", :en "Name"}, :target-tit {:hu "Link target", :en "Link target"}, :width-tit {:en "Width", :hu "Szélesség"}, :length-tit {:en "Length", :hu "Hossz"}, :color-gradient-tit {:hu "Színátmenet", :en "Color gradient"}, :description-tit {:hu "Leírás", :en "Description"}}}

为什么这会发生在我身上? :)

1 个答案:

答案 0 :(得分:1)

Clojure映射是无序的数据结构。它以存储在文件中的顺序被读取,并且键/值对很可能在读取时被添加到内存中的映射,但是当您遍历内存中的映射时,其键/值对将按照与地图实现的内部实现详细信息相关的顺序返回,通常涉及键的哈希值。

如果要保留顺序,可以保证Clojure列表和向量可以做到这一点。法线贴图和集合不是。映射和集合有各种排序形式,但是在EDN格式文件中使用它们需要一些特殊处理,而我以前从未使用过。