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

Ian*_*anC 5 jekyll

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

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

{%- for file in site.data.folder -%}
{{ file | inspect }}
<br />
<br />
{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)

据我了解,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 -%}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 文件的默认排序标准是什么_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
Run Code Online (Sandbox Code Playgroud)

每一个都有以下内容:

_data/文件夹/a.json:

{"name":"Mike"}
Run Code Online (Sandbox Code Playgroud)

_data/文件夹/b.json:

{"id":"4343"}
Run Code Online (Sandbox Code Playgroud)

_data/文件夹/c.json:

[{"age":"29"},{"job":"journalist"}]
Run Code Online (Sandbox Code Playgroud)

_data/文件夹/d.json:

{"name":"John"}
Run Code Online (Sandbox Code Playgroud)

_data/文件夹/e.json

{"haircolor":"green"}
Run Code Online (Sandbox Code Playgroud)

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

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

<br />
<br />

{%- for file in site.data.folder -%}
<pre>{{ file | inspect }}</pre>
<br />
{%- endfor -%}
Run Code Online (Sandbox Code Playgroud)

该页面的输出是:

{"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"}]
Run Code Online (Sandbox Code Playgroud)

这些文件不是按字母顺序排列的,而是按某种明显随机的顺序排列的。我可以使用以下方法按字母顺序排列它们:

---
---
<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 -%}
Run Code Online (Sandbox Code Playgroud)

输出:

[["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"}]
Run Code Online (Sandbox Code Playgroud)

但目前尚不清楚电话会议的订购标准是什么sort

Ian*_*anC 1

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


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

使用 Dir 的不确定文件顺序

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

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

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


Python 全局排序

Python 的 glob.glob 是如何排序的?

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

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

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