Reputation: 13
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 %} Uhr <span style="color:#cc0000">⟩</span> Treffpunkt: {{ 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" }} 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
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" }} Uhr</b> {{ vortrag.titel }}</li>
{% endfor %}
{% endif %}
{% endfor %}
</ol>
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" }} Uhr</b> {{ v.titel }}</li>
{% endfor %}
</ol>
Upvotes: 1