在 HUGO 中按日期对 JSON 数据进行排序
Sorting JSON data by date in HUGO
我在 HUGO 站点中使用以下数据结构
本地 appearances.json 文件中的数据:
{
"events":[ {
"name": "title three",
"date": "7/02/2022",
"url": "http://some.com"
},
{
"name": "title one",
"date": "5/01/2022",
"url": "http://some.com"
},
{
"name": "title two",
"date": "7/01/2022",
"url": "http://some.com"
}]
}
部分页面:
<div class="row listrecent">
{{ range .Site.Data.appearances.events }}
{{- partial "list-partials/appearancebox.html" . -}}
{{end}}
</div>
输出:
但是,我想按“日期”对数组的内容进行排序,最好将最新事件放在顶部 - 即可见的第一个块应该是“标题三”
我尝试了各种排序方法并取得了一些成功,但我似乎无法将按日期排序和转换字符串化日期结合起来。
我可以确保 JSON 的顺序正确,但这对我来说似乎很脆弱。
我不在我的开发设置附近,所以这将是伪代码和概念,但是:
- https://gohugo.io/functions/range/#readout <- 不是很详细。
- https://gohugo.io/functions/sort/#readout <- 更多数据。
所以,像这样:
作者:{{ range sort .Site.Params.authors }}{{ .firstName }} {{ end }}
(上面 link 2 中给出的示例)。
所以concept/psuedo,我相信:
{{ 范围排序 .Site.Data.etc.etc. “日期”}}
这将按升序排序(同样,不确定日期字段的最终输出,也是因为我相信您将日期作为字符串,据我所知,它是 json,但意思是,它不会给你预期的输出。所以你可能必须将该字段转换为日期对象或数据可排序概念,而不是字符串。
https://gohugo.io/functions/format/#use-local-and-utc
可能对此有所帮助。
同样,不在我的 compu/dev 设置附近,但以上应该有效。关键是排序命令。
假设您的 json 是“events.json”,然后使用以下代码:
<ul>
{{ range sort $json.events "date" "desc" }}
<li>
<b>
{{ .name }}
</b>
<br>
{{ .date }}
</li>
{{ end }}
</ul>
以上解决方案有效检查我的 branch repo
最后的解决方案是这样的:
{{ $events := slice }}
{{ range .Site.Data.appearances.events }}
{{ $event := . }}
{{ $parsedEvent := dict }}
{{ range $k, $v := $event }}
{{ if eq $k "date" }}
{{ $parsedEvent = merge $parsedEvent (dict $k (time $v)) }}
{{ else }}
{{ $parsedEvent = merge $parsedEvent (dict $k $v) }}
{{ end }}
{{ end }}
{{ $events = $events | append $parsedEvent }}
{{ end }}
<div class="row listrecent">
{{ range sort $events "date" "desc" }}
{{ if (.date.After now) }}
{{- partial "list-partials/appearancebox.html" . -}}
{{ end }}
{{end}}
</div>
如果有人有更清洁的方法,那么我洗耳恭听!
我在 HUGO 站点中使用以下数据结构 本地 appearances.json 文件中的数据:
{
"events":[ {
"name": "title three",
"date": "7/02/2022",
"url": "http://some.com"
},
{
"name": "title one",
"date": "5/01/2022",
"url": "http://some.com"
},
{
"name": "title two",
"date": "7/01/2022",
"url": "http://some.com"
}]
}
部分页面:
<div class="row listrecent">
{{ range .Site.Data.appearances.events }}
{{- partial "list-partials/appearancebox.html" . -}}
{{end}}
</div>
输出:
但是,我想按“日期”对数组的内容进行排序,最好将最新事件放在顶部 - 即可见的第一个块应该是“标题三”
我尝试了各种排序方法并取得了一些成功,但我似乎无法将按日期排序和转换字符串化日期结合起来。
我可以确保 JSON 的顺序正确,但这对我来说似乎很脆弱。
我不在我的开发设置附近,所以这将是伪代码和概念,但是:
- https://gohugo.io/functions/range/#readout <- 不是很详细。
- https://gohugo.io/functions/sort/#readout <- 更多数据。
所以,像这样:
作者:{{ range sort .Site.Params.authors }}{{ .firstName }} {{ end }}
(上面 link 2 中给出的示例)。
所以concept/psuedo,我相信: {{ 范围排序 .Site.Data.etc.etc. “日期”}}
这将按升序排序(同样,不确定日期字段的最终输出,也是因为我相信您将日期作为字符串,据我所知,它是 json,但意思是,它不会给你预期的输出。所以你可能必须将该字段转换为日期对象或数据可排序概念,而不是字符串。
https://gohugo.io/functions/format/#use-local-and-utc
可能对此有所帮助。
同样,不在我的 compu/dev 设置附近,但以上应该有效。关键是排序命令。
假设您的 json 是“events.json”,然后使用以下代码:
<ul>
{{ range sort $json.events "date" "desc" }}
<li>
<b>
{{ .name }}
</b>
<br>
{{ .date }}
</li>
{{ end }}
</ul>
以上解决方案有效检查我的 branch repo
最后的解决方案是这样的:
{{ $events := slice }}
{{ range .Site.Data.appearances.events }}
{{ $event := . }}
{{ $parsedEvent := dict }}
{{ range $k, $v := $event }}
{{ if eq $k "date" }}
{{ $parsedEvent = merge $parsedEvent (dict $k (time $v)) }}
{{ else }}
{{ $parsedEvent = merge $parsedEvent (dict $k $v) }}
{{ end }}
{{ end }}
{{ $events = $events | append $parsedEvent }}
{{ end }}
<div class="row listrecent">
{{ range sort $events "date" "desc" }}
{{ if (.date.After now) }}
{{- partial "list-partials/appearancebox.html" . -}}
{{ end }}
{{end}}
</div>
如果有人有更清洁的方法,那么我洗耳恭听!