关于for循环:Jekyll:按通用属性对_data子文件夹中的文件进行排序

Jeykll: Sorting files in _data subfolders by common property

我想遍历_data/sections/中的每个文件,但输出按所述文件中包含的数据排序(order属性)。 尽管我不确定为什么,但当前的输出恰好按正确的顺序排列,并且在修改sorted属性时顺序不会改变。

这些文件的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 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文档中数据文件的结构,for循环代码如下:

1
2
3
4
5
6
7
8
9
10
// project/index.html

// ...
{% for section_hash in site.data.sections | sort: 'order' %}
  {% assign section = section_hash[1] %}
  <p>
{{ section.title }} - {{ section.content }}
</p>
{% endfor %}
// ...

我还尝试过对部分进行排序,然后再将其传递给for循环,如下所示:

1
2
3
4
5
6
{% assign sections_sorted = sita.data.sections | sort: 'order' %}
{% for section in sections_sorted %}
  <p>
{{ section.title }} - {{ section.content }}
</p>
{% endfor %}

最后,我尝试将order属性移到_data/sections/中每个节文件的最前面,但这导致了异常:Liquid Exception: no implicit conversion of String into Integer

1
2
3
4
5
6
7
// project/_data/sections/drink.yml
---
order: 1
---

title: Drink
content:"Drink ipsum dolor sit amet."

_data/子目录中的文件是否可能? 如何按order按数字排序这些文件的输出,按title按字母顺序反向排序,等等?


只是面临同样的问题。 site.data.whatever用于文件夹始终为哈希

1
{ file_name => file_content, ... }

不幸的是,液体阵列过滤器不支持哈希。要将其转换为数组,可以使用以下过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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代码:

1
2
3
4
{% assign ordered_items =(site.data.folder_name | sort | order: 'field') %}
{% for item in ordered_items %}
    {{ item.<property_name> }}
{% endfor %}

如果folder_name指向CSV文件或JSON文件中的数组,则此代码也适用。


即使过时了,我也遇到了同样的问题。
我的解决方案是提供_index.xml来定义顺序,例如项目。

我们在这个文件夹中:_data / projects

有很多文件,例如

  • _index.yml
  • project_1.yml
  • project_2.yml
  • project_3.yml

_index.yml的内容如下所示:

1
2
3
- project_2
- project_1
- project_3

显示项目的调用如下所示:

1
2
3
4
{% for project_id in site.data.projects["_index"] %}
{% assign project = site.data.projects[project_id] %}
  // do something with the project
{% endfor %}

我希望这有帮助


您的第二个示例应该可以,但是有一个错字:sita.data.sections应该是site.data.sections

1
2
3
4
5
6
{% assign sections_sorted = site.data.sections | sort: 'order' %}
{% for section in sections_sorted %}
  <p>
{{ section.title }} - {{ section.content }}
</p>
{% endfor %}

我不确定我的问题是否与您有关。我正在尝试对_data目录中的文件进行排序,但是我的文件采用JSON格式。无论我做什么,都会收到此错误消息:jekyll 2.5.3 | Error: no implicit conversion of String into Integer。我的JSON文件根本不包含任何要点。该错误消息告诉我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起开始起作用,请参见此线程:带有Jekyll和Liquid的排序导航菜单