【问题标题】:How can I sort nested Data with Jekyll/Liquid如何使用 Jekyll/Liquid 对嵌套数据进行排序
【发布时间】:2019-12-19 02:24:00
【问题描述】:

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

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

无法对空对象进行排序

我的液体代码

<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

我正在尝试按开始时间startfuehrungen 进行排序。


@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

液体/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:
      …

【问题讨论】:

  • 无法重现此错误。如何测试具有相同时间戳的事件的排序?
  • 感谢您的申请。我在原始问题中添加了更多信息。
  • 您是否有包含重现此错误的代码的存储库? Gemfile 内容?
  • 是的,大卫。你在这里:Repository谢谢你的帮助。
  • 无复制。此代码是否会在您的计算机上引发错误?

标签: jekyll liquid


【解决方案1】:

正如您在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>

【讨论】:

  • 感谢您的解决方案。有时就是这么容易。我预计要到星期一才能对其进行测试。
  • 谢谢大卫,这行得通。不过,我还是想要高一级,所以排序不是按programmfk.nummer。我想按programmfk['vortraege'] 列出并排序('start')。你能再帮帮我吗?
  • 编辑了我的答案,一次性对所有vortraege 进行排序。
  • 非常感谢大卫。你是我的杰基尔王 ;-)
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 2019-07-26
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多