【问题标题】:Jekyll: What is the default _data sorting criteria?Jekyll:默认的数据排序标准是什么?
【发布时间】:2018-01-19 16:50:12
【问题描述】:

在遍历_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/folder/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的通话的订购标准是什么。

【问题讨论】:

  • 要检查您实际处理的数据,请尝试“检查”:&lt;pre&gt;{{ site.data }}&lt;/pre&gt;
  • 从我在这里看到的,它是一个带有指向其值的散列的对象。哈希是文件名,值是包含文件数据的对象。我仍然不明白为什么默认情况下以这种方式订购它们。如果它们按字母顺序加载对我来说是有意义的,但到目前为止它看起来有点随机(尽管如果再次加载相同的文件它不会改变顺序)。
  • 我在 Windows 上使用 Jekyll.. 最后,哈希的键按字母顺序排列(在多个构建会话中输出相同),无论文件何时被修改..(所以这是窗外也是..)
  • @ashmaroli 我刚刚在这里再次测试了一个完全清晰的 Jekyll 站点,但排序又是乱序的(非字母顺序)。但是我在 Linux 上运行,也许 Windows 版本的行为不同?作为示例,我将编辑问题以包含数据文件夹中的文件及其内容。
  • Windows 没有单独的版本.. 我使用的 Rubygem 和你一样.. 不同平台的 Ruby 解释器中的差异在较低级别.. 因为你有一个解决方案手头,我建议去。. IMO,这不是 Jekyll 问题.. 但如果你不觉得,我建议你在 Jekyll GitHub Repo 上打开一个问题

标签: jekyll


【解决方案1】:

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


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

Indeterministic File order using Dir

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

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

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


Python 全局排序

How is Pythons glob.glob ordered?

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

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

由于 Jekyll 订购了 _post 文件,我认为默认订购 _data 文件也不是什么大问题,以避免任何混淆。但正如之前在问题本身中所述,使用sort 过滤器可以轻松完成。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2015-10-29
    • 2021-11-14
    • 1970-01-01
    • 2020-10-27
    • 2011-09-14
    相关资源
    最近更新 更多