TGermer
TGermer

Reputation: 13

How can I sort nested Data with Jekyll/Liquid

Is it possible to sort nested data?

I tried it with assign, but an error occurred:

Cannot sort a null object

My Liquid-Code

<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>

My programmfk.yml (just a little part of …)

- 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

I'm trying to sort fuehrungen by start-time start.


@david-jacquel

If I use a yml-file online for fuehrungen than it's working.

My 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

The 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 %}

But in my original programmfk.yml I have one more level before and I'm not able to get the result with that level.

- nummer:
  …
  fuehrungen:
    - title:
      …

Upvotes: 1

Views: 412

Answers (1)

David Jacquel
David Jacquel

Reputation: 52799

As seen in your repository, you somewhere have an empty vortraege hidden in your code :

- 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:

In your code vortraege['vortraege'] can be null or empty and contains no object containing a start field to sort on. This explains your error.

You can test if you have anything to sort before sorting {% if vortraege['vortraege'].size %}

That gives :

<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>

Edit: Sorting all vortraege from programmfk data file in one time

{% 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>

Upvotes: 1

Related Questions