Jekyll:默认_data排序标准是什么?



>遍历_data文件夹中的文件数组时,对文件进行排序的默认标准是什么?

起初我期望它按字母顺序排序,但经过一些测试后,我意识到事实并非如此。尽管如此,我还是无法弄清楚用于对文件进行排序的标准是什么。

{%- for file in site.data.folder -%}
{{ file | inspect }}
<br />
<br />
{%- endfor -%}

据我了解file是一个数组,其中包含文件名作为第一个元素,数据作为第二个元素,所以我不确定使用带有任何属性名称的sort是否有效。当我尝试时,我收到错误消息:

Liquid Exception: no implicit conversion of String into Integer

当使用不带参数的sort时,我可以返回按文件名字母顺序排序的文件:

{%- assign files = site.data.folder | sort -%}
{%- for file in files -%}
{{ file | inspect }}
<br />
<br />
{%- endfor -%}

所以我的问题是:

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

例:

创建默认的 Jekyll 页面后,我创建了_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:

{"name":"Mike"}

_data/folder/b.json:

{"id":"4343"}

_data/folder/c.json:

[{"age":"29"},{"job":"journalist"}]

_data/folder/d.json:

{"name":"John"}

_data/文件夹/e.json

{"haircolor":"green"}

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

---
---
<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"}]

但目前还不清楚没有sort的电话的排序标准是什么。

从@ashmaroli认为这不是 Jekyll 的问题的假设出发,我开始对文件排序进行一些研究,并遇到了以下资源:


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

使用 Dir 的不确定文件顺序

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

Dir[File.join(File.dirname(__FILE__), 'example/*.rb')].each{ |f| require f }

这显然是由于根据链接中的答案进行底层glob系统调用。


Python glob 排序

Pythons glob.glob是如何排序的?

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

第一个答案指出,如果您运行ls -U则会获得文件的无序列表,这与我在 Jekyll 上制作_data对象列表而不进行排序时的顺序相匹配。所以这很可能是奇怪排序的原因:它依赖于操作系统。

由于 Jekyll 订购_post文件,我认为默认情况下对_data文件进行排序也不会成为主要问题,以避免任何混淆。但正如之前在问题本身中所述,可以使用sort过滤器轻松完成。

最新更新