我想迭代_data/sections/
中的每个文件,但输出按所述文件中包含的数据排序(order属性)。当前输出的顺序正确,但我不确定原因,并且在修改已排序的属性时,顺序不会发生变化。
文件结构如下:
// project/_data/sections/food.yml
title: Food
order: 2
content: "Food ipsum dolor sit amet."
-----
// project/_data/sections/drink.yml
title: Drink
order: 1
content: "Drink ipsum dolor sit amet."
遵循Jekyll docs for data files上的结构,for循环代码如下:
// project/index.html
// ...
{% for section_hash in site.data.sections | sort: 'order' %}
{% assign section = section_hash[1] %}
<p><strong>{{ section.title }}</strong> - {{ section.content }}</p>
{% endfor %}
// ...
我还尝试在将这些部分传递给for循环as seen here之前对这些部分进行排序:
{% assign sections_sorted = sita.data.sections | sort: 'order' %}
{% for section in sections_sorted %}
<p><strong>{{ section.title }}</strong> - {{ section.content }}</p>
{% endfor %}
最后,我尝试将order
属性移到_data/sections/
中每个部分文件的前端,但这导致异常:Liquid Exception: no implicit conversion of String into Integer
// project/_data/sections/drink.yml
---
order: 1
---
title: Drink
content: "Drink ipsum dolor sit amet."
_data/
的子目录中的文件是否可以实现?如何按order
以数字方式对这些文件的输出进行排序,按title
按字母顺序排序,依此类推?
答案 0 :(得分:2)
刚遇到同样的问题。文件夹的site.data.whatever
始终是哈希
{ file_name => file_content, ... }
不幸的是,液晶阵列滤镜不支持散列。要将其转换为数组,可以使用以下过滤器:
module Jekyll
module ValuesFilter
def values(input)
case
when input.instance_of?(Hash)
input.values
else
input
end
end
end
end
Liquid::Template.register_filter(Jekyll::ValuesFilter)
将其放入_plugins
个文件夹并使用下一个Liquid代码:
{% assign ordered_items =(site.data.folder_name | sort | order: 'field') %}
{% for item in ordered_items %}
{{ item.<property_name> }}
{% endfor %}
如果folder_name
指向CSV文件或JSON文件中的数组,此代码也有效。
答案 1 :(得分:0)
我不确定我的问题是否与您的问题有关。我正在尝试对_data
目录中的文件进行排序,但我的文件是JSON格式。无论我做什么,我都会收到以下错误消息:jekyll 2.5.3 | Error: no implicit conversion of String into Integer
。我的JSON文件根本不包含任何frontmatter。错误消息告诉我Ruby尝试使用字符串来访问数组,但是出于任何原因需要一个整数,例如: my_array["blah"]
代替my_array[1]
。这没有多大意义,因为sort:"blah"
实际上提供了一个字符串。你能解决这个问题吗?
关于你的第一个例子:
{% for section_hash in site.data.sections | sort: 'order' %}
我不认为这有效,我相信这不是在Liquid中实现的。请参阅此问题:https://github.com/Shopify/liquid/pull/304
但我不明白为什么你的第二个例子不起作用,也许我在这里误解了一些东西:
{% assign sections_sorted = sita.data.sections | sort: 'order' %}
显然,这应该从Jekyll 2.2.0开始工作,请看这个主题:Sorted navigation menu with Jekyll and Liquid
答案 2 :(得分:0)
你的第二个例子应该有用,但你有一个拼写错误:sita.data.sections
应该是site.data.sections
。
{% assign sections_sorted = site.data.sections | sort: 'order' %}
{% for section in sections_sorted %}
<p><strong>{{ section.title }}</strong> - {{ section.content }}</p>
{% endfor %}
答案 3 :(得分:0)
即使这是过时的,我也遇到了同样的问题。 我的解决方案是提供_index.xml来定义例如项目。
我们在此文件夹中: _data / projects
文件很多,例如
_index.yml的内容如下:
- project_2
- project_1
- project_3
显示项目的调用如下:
{% for project_id in site.data.projects["_index"] %}
{% assign project = site.data.projects[project_id] %}
// do something with the project
{% endfor %}
我希望这对您有帮助