是否可以根据两个变量对 Jekyll 数组进行排序?
Is it possible to sort a Jekyll array based on two variables?
在我网站的首页上,我显示了最新的几个 posts:
{% for post in posts limit: 6 %}
...
{% endfor %}
这很好用。
最近我一直在回去编辑一些旧的 posts,我希望它们显示在首页的这个列表中。
我不想更改他们的日期。相反,我一直在编辑时向每个 post 添加一个新的 lastUpdated
变量,以及我编辑它的日期。
layout: example
lastUpdated: 2020-09-07
---
所以现在我想修改首页上的代码,如果 post 有它,它按 lastUpdated
排序,否则它应该按 date
排序。
我试过这个:
{% assign posts = site.posts
| reverse
| sort: "lastUpdated"
| reverse %}
{% for post in posts limit: 6 %}
...
{% endfor %}
我认为这行得通,但事实证明它将所有已编辑的 posts(包含 lastEdited
变量的 posts)排序到前面,然后是新创建的 post 个。我希望编辑的 posts 和新创建的 posts 都显示在此列表中,基于它们的“修改”日期。
我试过这个:
{% assign posts = site.posts
| sort: "lastUpdated or date" %}
{% for post in posts limit: 6 %}
...
{% endfor %}
但这给了我默认顺序的 posts,大概是因为 "lastUpdated or date"
不是有效的 属性.
我也试过这个:
{% assign posts = site.posts
| sort: "lastUpdated" or "date" %}
{% for post in posts limit: 6 %}
...
{% endfor %}
但毫不奇怪,这是一个语法错误。
有没有我缺少的简单方法?
写完这篇文章后,我 nerd-sniped 自己拼凑了一个创建两个数组的解决方案,然后根据 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
填充每个 post 以保持简单。
在我网站的首页上,我显示了最新的几个 posts:
{% for post in posts limit: 6 %}
...
{% endfor %}
这很好用。
最近我一直在回去编辑一些旧的 posts,我希望它们显示在首页的这个列表中。
我不想更改他们的日期。相反,我一直在编辑时向每个 post 添加一个新的 lastUpdated
变量,以及我编辑它的日期。
layout: example
lastUpdated: 2020-09-07
---
所以现在我想修改首页上的代码,如果 post 有它,它按 lastUpdated
排序,否则它应该按 date
排序。
我试过这个:
{% assign posts = site.posts
| reverse
| sort: "lastUpdated"
| reverse %}
{% for post in posts limit: 6 %}
...
{% endfor %}
我认为这行得通,但事实证明它将所有已编辑的 posts(包含 lastEdited
变量的 posts)排序到前面,然后是新创建的 post 个。我希望编辑的 posts 和新创建的 posts 都显示在此列表中,基于它们的“修改”日期。
我试过这个:
{% assign posts = site.posts
| sort: "lastUpdated or date" %}
{% for post in posts limit: 6 %}
...
{% endfor %}
但这给了我默认顺序的 posts,大概是因为 "lastUpdated or date"
不是有效的 属性.
我也试过这个:
{% assign posts = site.posts
| sort: "lastUpdated" or "date" %}
{% for post in posts limit: 6 %}
...
{% endfor %}
但毫不奇怪,这是一个语法错误。
有没有我缺少的简单方法?
写完这篇文章后,我 nerd-sniped 自己拼凑了一个创建两个数组的解决方案,然后根据 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
填充每个 post 以保持简单。