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