迭代文件夹中的文件数组时_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。
根据 @ashmaroli 的假设,这不是 Jekyll 的问题,我开始对文件排序进行一些研究,并遇到了以下资源:
该链接描述了加载多个依赖项时的反直觉行为。如果文件加载的顺序很重要,下面的快捷方式可能会导致它们以与预期不同的顺序加载。
Dir[File.join(File.dirname(__FILE__), 'example/*.rb')].each{ |f| require f }
Run Code Online (Sandbox Code Playgroud)
glob根据链接中的答案,这显然是由于底层系统调用造成的。
在上面的 SO 问题中,用户询问为什么globPython 中返回的文件顺序与ls -l. 尽管问题是关于 Python 而不是 Ruby,但对操作系统的底层调用可能是相同的。操作系统不需要以任何顺序传递文件,因此应在调用后对它们进行排序。
第一个答案指出,如果运行,ls -U您将获得无序列表的文件,这与我在 Jekyll 上创建对象列表_data而不进行排序时的顺序相匹配。所以这很可能是奇怪顺序的原因:它依赖于操作系统。
由于 Jekyll 对文件进行排序,我认为默认情况下_post对文件进行排序也不会是一个主要问题,以避免任何混淆。_data但正如问题本身之前所述,可以使用sort过滤器轻松完成。
| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |