在迭代_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 /文件夹/ a.json:
{"name":"Mike"}
_data /文件夹/ b.json:
{"id":"4343"}
_data /文件夹/ c.json:
[{"age":"29"},{"job":"journalist"}]
_data /文件夹/ 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
,则仍然不清楚通话中的排序条件是什么。
答案 0 :(得分:0)
从@ ashmaroli假设这不是Jekyll的问题,我开始对文件排序进行一些研究并遇到以下资源:
Indeterministic File order using Dir
该链接描述了加载多个依赖项时的反直觉行为。如果加载文件的顺序很重要,则下面的快捷方式可能导致它们以不同于预期的顺序加载。
Dir[File.join(File.dirname(__FILE__), 'example/*.rb')].each{ |f| require f }
这显然是由于根据链接中的答案进行的基础glob
系统调用。
How is Pythons glob.glob ordered?
在上面的SO问题中,用户问为什么Python中返回的glob
文件顺序与ls -l
输出的顺序不同。即使问题是关于Python而不是Ruby,对操作系统的底层调用可能是相同的。操作系统不需要以任何顺序传送文件,因此应在通话后对其进行排序。
first answer表示如果你运行ls -U
,你会得到无序的文件列表,这与我在Jekyll上列出_data
个对象时没有排序的顺序相匹配。所以这很可能是奇怪排序的原因:它取决于操作系统。
由于Jekyll订购了_post
个文件,我认为默认情况下订购_data
文件也不是一个主要问题,以避免任何混淆。但正如之前在问题中所述,可以使用sort
过滤器轻松完成。