Jekyll 杰基尔:默认的数据排序标准是什么?

Jekyll 杰基尔:默认的数据排序标准是什么?,jekyll,Jekyll,在遍历\u data文件夹中的文件数组时,文件排序的默认标准是什么 起初我希望它能按字母顺序排序,但经过一些测试后,我意识到它不是。尽管如此,我还是搞不清楚对文件进行排序时使用的标准是什么 {%- for file in site.data.folder -%} {{ file | inspect }} <br /> <br /> {%- endfor -%} 因此,我的问题是: \u数据文件的默认排序标准是什么 是否可以根据对象属性进行排序?(我认为,当您访问sit

在遍历
\u data
文件夹中的文件数组时,文件排序的默认标准是什么

起初我希望它能按字母顺序排序,但经过一些测试后,我意识到它不是。尽管如此,我还是搞不清楚对文件进行排序时使用的标准是什么

{%- for file in site.data.folder -%}
{{ file | inspect }}
<br />
<br />
{%- endfor -%}
因此,我的问题是:

  • \u数据
    文件的默认排序标准是什么
  • 是否可以根据对象属性进行排序?(我认为,当您访问
    site.data.folder
    时,它的问题是有一个数组,而不是纯对象)

例子: 创建默认的Jekyll页面后,我创建了
\u data/folder
目录,其中包括5个随机
.json
文件:

_data/folder/a.json
_data/folder/b.json
_data/folder/c.json
_data/folder/d.json
_data/folder/e.json
其中每一项都有以下内容:

_data/folder/a.json:

_data/folder/b.json:

_data/folder/c.json:

_data/folder/d.json:

_data/folder/e.json

有了这些文件,我在根目录上创建了一个名为
page.html
的页面,其中包含:

---
---
<pre>{{ site.data.folder | inspect }}</pre>

<br />
<br />

{%- for file in site.data.folder -%}
<pre>{{ file | inspect }}</pre>
<br />
{%- endfor -%}
Dir[File.join(File.dirname(__FILE__), 'example/*.rb')].each{ |f| require f }
这些文件不是按字母顺序排列的,而是按某种明显的随机顺序排列的。我可以使用以下命令按字母顺序获取它们:


但是现在还不清楚在没有排序的情况下,调用的排序标准是什么。根据@ashmaroli的假设,这不是Jekyll的问题,我开始对文件排序进行一些研究,并使用了以下资源:


在Ruby上使用Dir时的文件排序行为

该链接描述了加载多个依赖项时的反直觉行为。如果文件的加载顺序有问题,则下面的快捷方式可能会导致文件的加载顺序与预期的不同

根据链接中的答案,这显然是由于基础的
glob
系统调用造成的


Python全局排序

在上面的SO问题中,用户询问为什么Python中返回的
glob
文件顺序与
ls-l
的输出顺序不同。尽管问题是关于Python而不是Ruby,但对操作系统的底层调用可能是相同的。操作系统不需要以任何顺序传递文件,因此应该在调用后对文件进行排序

如果运行
ls-U
,则会得到无序的文件列表,这与我在Jekyll上创建
\U data
对象列表而不进行排序时的顺序相匹配。所以这很可能是导致这种奇怪排序的原因:它依赖于操作系统


由于Jekyll订购了
\u post
文件,我认为默认情况下订购
\u data
文件也不是什么大问题,以避免任何混淆。但是,正如前面在问题本身中所述,使用
排序
过滤器可以很容易地完成。

要检查您实际处理的数据,请尝试“检查”:
{{site.data}
从这里我可以看到,它是一个带有哈希值的对象。散列是文件名,值是包含文件数据的对象。我仍然不明白为什么默认情况下会这样订购。如果它们是按字母顺序加载的,这对我来说是有意义的,但到目前为止,它看起来有点随机(尽管如果再次加载相同的文件,它不会改变顺序)。。在我的末尾,哈希表的键按字母顺序排列(在多个构建会话中输出相同),而不管文件何时被修改。。(这也是窗外的情况。)@ashmaroli我刚刚用一个完全清晰的Jekyll站点再次测试了一下,排序再次出现了混乱(非字母顺序)。但我是在Linux上运行的,也许Windows版本的行为有所不同?我将编辑该问题,以包括数据文件夹中的文件及其内容,例如。Windows没有单独的版本。。我用的是和你一样的Rubygem。。不同平台的Ruby解释器之间的差别要小得多。。既然你手头有一个解决办法,我建议你还是照办。。依我看,这不是杰基尔的问题。。但如果你不这么认为,我建议你在Jekyll GitHub回购协议上公开一个问题
{"id":"4343"}
[{"age":"29"},{"job":"journalist"}]
{"name":"John"}
{"haircolor":"green"}
---
---
<pre>{{ site.data.folder | inspect }}</pre>

<br />
<br />

{%- for file in site.data.folder -%}
<pre>{{ file | inspect }}</pre>
<br />
{%- endfor -%}
{"e"=>{"haircolor"=>"green"}, "c"=>[{"age"=>"29"}, {"job"=>"journalist"}], "d"=>{"name"=>"John"}, "a"=>{"name"=>"Mike"}, "b"=>{"id"=>"4343"}}



["e", {"haircolor"=>"green"}]


["c", [{"age"=>"29"}, {"job"=>"journalist"}]]


["d", {"name"=>"John"}]


["a", {"name"=>"Mike"}]


["b", {"id"=>"4343"}]
---
---
<pre>{{ site.data.folder | sort | inspect }}</pre>

<br />
<br />

{%- assign folder = site.data.folder | sort -%}
{%- for file in folder -%}
<pre>{{ file | inspect }}</pre>
<br />
{%- endfor -%}
[["a", {"name"=>"Mike"}], ["b", {"id"=>"4343"}], ["c", [{"age"=>"29"}, {"job"=>"journalist"}]], ["d", {"name"=>"John"}], ["e", {"haircolor"=>"green"}]]



["a", {"name"=>"Mike"}]


["b", {"id"=>"4343"}]


["c", [{"age"=>"29"}, {"job"=>"journalist"}]]


["d", {"name"=>"John"}]


["e", {"haircolor"=>"green"}]
Dir[File.join(File.dirname(__FILE__), 'example/*.rb')].each{ |f| require f }