如何使用 Jekyll/Liquid 对嵌套数据进行排序

How can I sort nested Data with Jekyll/Liquid

是否可以对嵌套数据进行排序?

我用assign试了一下,但是出现错误:

Cannot sort a null object

我的液体代码

<ol>
{% for fuehrung2 in site.data.programmfk %}
{% assign fuehrung1 = fuehrung2['fuehrungen'] | sort: "start" %}
  {% for fuehrung in fuehrung1 %}
    <li>{{ fuehrung.titel }}<br>{{ fuehrung.start | date: "%H:%M" }}{% if fuehrung.ende != nil %}–{{ fuehrung.ende | date: "%H:%M" }}{% endif %}&nbsp;Uhr <span style="color:#cc0000">&#10217;</span>&nbsp;Treffpunkt:&nbsp;{{ fuehrung.treffpunkt | join: " & " }}</li>
  {% endfor %}
{% endfor %}
</ol>

我的programmfk.yml(只是……的一小部分)

- nummer: "04"
  titel: Elektrotechnik und Informationstechnik
  infostand: Lothstraße 64
  gespraech:
    start: 2020-03-28 10:00
    ende: 2020-03-28 15:00
    punkte:
      - Vertiefungsrichtung Kommunikationstechnik
      - Demos Labor Schaltungstechnik
      - Robotikwerkstatt
      - Smart Car
      - Computer Kicker
  praesentation:
    start:
    ende:
    punkte:
  vortraege:
    - titel: Vorstellung der Studiengänge
      start: 2020-03-28 11:00
      ende: 2020-03-28 12:00
      raum: E 0.103
  fuehrungen:
    - titel: Nachrichtensatellitentechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 12:00
      ende: 2020-03-28 12:30
    - titel: Regelungstechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 12:30
      ende: 2020-03-28 13:00
    - titel: Aufbau- und Verbindungstechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 13:00
      ende: 2020-03-28 13:30
    - titel: Regelungstechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 13:30
      ende: 2020-03-28 14:00

我正在尝试按开始时间 start 排序 fuehrungen


@david-jacquel

如果我在 fuehrungen 在线使用 yml 文件,它就可以正常工作。

我的fuehrungen.yml

fuehrungen:
    - titel: Motorenlabor
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 11:00
      ende: 2020-03-28 11:45
    - titel: Motorenlabor
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 12:00
      ende: 2020-03-28 12:45
    - titel: Nachrichtensatellitentechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 12:00
      ende: 2020-03-28 12:30
    - titel: Regelungstechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 12:30
      ende: 2020-03-28 13:00
    - titel: Aufbau- und Verbindungstechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 13:00
      ende: 2020-03-28 13:30
    - titel: Regelungstechnik
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 13:30
      ende: 2020-03-28 14:00
    - titel: Einführung und experimentelle Laborführung Technische Redaktion und Kommunikation
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 11:45
      ende: 2020-03-28 12:30
    - titel: Führung Bereich Papier und Verpackung (Labore, Maschinenhalle etc.)
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 12:15
      ende: 2020-03-28 13:00
    - titel: "Laborführung: Studiengang Druck- und Medientechnik „Produktion von Fotobüchern“"
      treffpunkt: Infostand der Fakultät
      start: 2020-03-28 13:50
      ende: 2020-03-28 14:15

Liquid/HTML

{% assign fuehrungSort = site.data.fuehrungen['fuehrungen'] | sort: "start" %}
{% for fuehrung in fuehrungSort %}
  <li><b>{{ fuehrung.start | date: "%H:%M" }}&nbsp;Uhr</b> {{ fuehrung.titel }}</li>
{% endfor %}

但在我原来的 programmfk.yml 我之前还有一个级别,我无法获得那个级别的结果。

- nummer:
  …
  fuehrungen:
    - title:
      …

如您的 repository 所示,您的代码中某处隐藏了一个空 vortraege :

- nummer: "13"
  titel: Studium Generale und Interdisziplinäre Studien
  infostand: Lothstraße 64
  gespraech:
    start: 2020-03-28 10:00
    ende: 2020-03-28 15:00
    punkte:
  praesentation:
    start:
    ende:
    punkte:
  vortraege:
  fuehrungen:

在您的代码中,vortraege['vortraege'] 可以为 null 或空,并且不包含包含要排序的 start 字段的对象。这解释了你的错误。

您可以在排序前测试是否有任何要排序的内容{% if vortraege['vortraege'].size %}

这给出了:

<ol>
{% for vortraege in site.data.programmfk %}
  {% if vortraege['vortraege'].size %}
    {% assign vortraegeSort = vortraege['vortraege'] | sort: 'start' %}
    {% for vortrag in vortraegeSort %}
      <li><b>{{ vortrag.start | date: "%H:%M" }}&nbsp;Uhr</b> {{ vortrag.titel }}</li>
    {% endfor %}
  {% endif %}
{% endfor %}
</ol>

编辑:一次性对 programmfk 数据文件中的所有 vortraege 进行排序

{% comment %} --- Create an empty array --- {% endcomment %}
{% assign vortraege_all = '' | split: '' %}

{% for vortraege in site.data.programmfk %}

  {% comment %} --- Only if vortraege['vortraege'] contains something
  -- {% endcomment %}
  {% if vortraege['vortraege'].size %}

    {% comment %} --- Concatenate vortraege_all and current non-empty vortraege['vortraege'] --- {% endcomment %}
    {% assign vortraege_all = vortraege_all | concat: vortraege['vortraege'] %}

  {% endif %}
{% endfor %}

{% comment %} ----------- Sorting -------------- {% endcomment %}
{% assign vortraege_all = vortraege_all | sort: 'start' %}

<ol>
{% for v in vortraege_all %}
  <li><b>{{ v.start | date: "%H:%M" }}&nbsp;Uhr</b> {{ v.titel }}</li>
{% endfor %}
</ol>