Возможно ли отсортировать массив Jekyll на основе двух переменных?

#jekyll #github-pages #liquid

#jekyll #github-страницы #жидкость

Вопрос:

На главной странице моего сайта я показываю несколько последних сообщений:

 {% for post in posts limit: 6 %}
  ...
{% endfor %}
  

Это работает нормально.

Недавно я вернулся и отредактировал несколько старых постов, и я хочу, чтобы они отображались в этом списке на главной странице.

Я не хочу менять их дату. Вместо этого я добавлял новую lastUpdated переменную к каждой записи по мере ее редактирования с указанием даты, когда я ее редактировал.

 layout: example
lastUpdated: 2020-09-07
---
  

Итак, теперь я хочу изменить код на моей главной странице, чтобы он сортировался по lastUpdated , если он есть в публикации, а в противном случае он должен сортироваться по date .

Я попробовал это:

 {% assign posts = site.posts
    | reverse
    | sort: "lastUpdated"
    | reverse %}
{% for post in posts limit: 6 %}
  ...
{% endfor %}
  

Я думал, что это сработало, но оказывается, что он сортирует все отредактированные записи (записи, содержащие lastEdited переменные) на начало, за которыми следуют вновь созданные записи. Я хочу, чтобы отредактированные записи и вновь созданные записи отображались в этом списке в зависимости от даты их «изменения».

Я попробовал это:

 {% assign posts = site.posts
    | sort: "lastUpdated or date" %}
{% for post in posts limit: 6 %}
  ...
{% endfor %}
  

Но это дает мне сообщения в порядке по умолчанию, предположительно потому, что "lastUpdated or date" это недопустимое свойство.

Я также пробовал это:

 {% assign posts = site.posts
    | sort: "lastUpdated" or "date" %}
{% for post in posts limit: 6 %}
  ...
{% endfor %}
  

Но неудивительно, что это синтаксическая ошибка.

Есть ли простой способ сделать это, которого мне не хватает?

Ответ №1:

Как только я написал это, я поднаторел в создании решения, которое создает два массива, а затем объединяет их вместе на основе переменных lastUpdated и date .

 {% assign createdPosts = site.posts %}
{% assign updatedPosts = site.posts | sort: "lastUpdated" | reverse %}

{% assign createdIndex = 0 %}
{% assign updatedIndex = 0 %}

{% for i in (1..10) %}
  {% assign createdDate = createdPosts[createdIndex].date | date: "%Y-%m-%d" %}
  {% assign updatedDate = updatedPosts[updatedIndex].lastUpdated | date: "%Y-%m-%d" %}

  {% if createdDate > updatedDate or updatedDate == nil %}
    // HTML for createdPosts[createdIndex]
    {% assign createdIndex = createdIndex | plus:1 %}
  {% else %}
    // HTML for updatedPosts[updatedIndex]
    {% assign updatedIndex = updatedIndex | plus:1 %}
  {% endif %}

{% endfor %}
  

Следует отметить, что я не мог сравнить date и lastUpdated напрямую, потому что я получил эту ошибку: comparison of Date with Time failed , поэтому мне пришлось преобразовать их оба в строки.

Это кажется довольно сложным, поэтому я мог бы в конечном итоге вернуться и заполнить каждый пост lastUpdated , чтобы все было просто.