Jekyll:按大小排序集合

时间:2017-11-06 11:18:00

标签: jekyll liquid

我想根据每个集合中的文档数量对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的参数只能是被排序对象类型的直接字段,而不是字段的字段。

有没有办法按照它们包含的文档数量对集合进行排序?

2 个答案:

答案 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)

  1. 构建可用尺寸的数组:

    {% assign sorted = '' | split: "" %}
    {% for coll in site.collections %} 
        {% assign sorted = sorted| append: coll.docs.size %} 
    {% endfor %}
    
  2. 对上面的数组进行排序。

  3. 迭代上面的数组,并且所有集合仅打印大小与排序的数组编号匹配的集合。