我想根据每个集合中的文档数量对Jekyll集合进行排序。
site.collections
变量中的每个集合都有一个docs
字段,docs
字段(这是一个文档数组)有一个size
字段,这是此集合中的文档数量(请参阅documentation)。
然而,这样的事情不起作用:
{% assign sorted = site.collections | sort: 'docs.size' %}
{% for coll in sorted %}
...
{% endfor %}
导致
Liquid Exception: no implicit conversion of String into Integer
似乎sort
的参数只能是被排序对象类型的直接字段,而不是字段的字段。
有没有办法按照它们包含的文档数量对集合进行排序?
答案 0 :(得分:2)
好吧,我以一种相当丑陋的方式实现了它,与marcanuy's answer一致。
<!-- Create a comma-separated string of all the sizes of the collections -->
{% for coll in site.collections %}
{% if coll.title %}
{% if coll.docs.size < 10 %}
{% assign str = coll.docs.size | prepend: "00" %}
{% elsif coll.docs.size < 100 %}
{% assign str = coll.docs.size | prepend: "0" %}
{% else %}
{% assign str = coll.docs.size %}
{% endif %}
{% assign sizes = sizes | append: str | append: "," %}
{% endif %}
{% endfor %}
<!-- Remove last comma of string -->
{% assign length = sizes | size | minus: 1 %}
{% assign sizes = sizes | slice: 0, length %}
<!-- Split string into array, sort DESC, and remove duplicate elements -->
{% assign sizes = sizes | split: "," | sort | reverse | uniq %}
<!-- Iterate through sizes, and for each size print those collections that have this size -->
{% for s in sizes %}
{% for coll in site.collections %}
{% assign i = s | plus: 0 %}
{% if coll.docs.size == i %}
<p>{{ coll.title }}: {{ i }} documents</p>
{% endif %}
{% endfor %}
{% endfor %}
主要困难在于,像这样创建的大小数组是一个字符串数组,对它进行排序会产生按字母顺序排序的顺序,而不是数字排序顺序(例如"15"
来自{{1} }})。
为了解决这个问题,我将"2"
添加到小于10的数字,将"00"
添加到小于100的数字。这使得按字母顺序排序的顺序与所需的数字排序顺序一致。
然后我遍历这些大小(仍然是字符串),并将它们动态转换为整数("0"
),以便我可以将它们与每个集合的plus: 0
字段进行比较。
它非常详细,但由于这只是在生成网站时执行,而不是在生产模式下的每个请求中执行,所以没关系。
仍然欢迎更好的解决方案!
答案 1 :(得分:1)
构建可用尺寸的数组:
{% assign sorted = '' | split: "" %}
{% for coll in site.collections %}
{% assign sorted = sorted| append: coll.docs.size %}
{% endfor %}
对上面的数组进行排序。