首页 文章

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

提问于
浏览
0

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

起初我希望它按字母顺序排序,但经过一些测试我发现它不是 . 不过,我无法弄清楚用于对文件进行排序的标准是什么 .

{%- for file in site.data.folder -%}
{{ file | inspect }}


{%- 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 }}


{%- 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>



{%- for file in site.data.folder -%} <pre>{{ file | inspect }}</pre>
{%- 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>



{%- assign folder = site.data.folder | sort -%} {%- for file in folder -%} <pre>{{ file | inspect }}</pre>
{%- 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 的呼叫的排序标准是什么 .

1 回答

  • 0

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


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

    Indeterministic File order using Dir

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

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

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


    Python glob排序

    How is Pythons glob.glob ordered?

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

    first answer声明如果你运行 ls -U ,你会得到无序的文件列表,当我在Jekyll上列出 _data 对象而没有排序时,它与我在这里的顺序相匹配 . 所以这很可能是奇怪排序的原因:它依赖于操作系统 .

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

相关问题