collections.Where
Syntax
collections.Where COLLECTION KEY [OPERATOR] MATCH
Returns
any
Alias
where
where
过滤一个数组,只保留包含给定字段匹配值的元素。
它的工作方式类似于 SQL 中的 where
关键字。
{{ range where .Pages "Section" "foo" }}
{{ .Content }}
{{ end }}
可以通过使用点语法将第二个参数链式连接,以引用嵌套元素的值。
---
series: golang
title: 例子
---
+++
series = 'golang'
title = '例子'
+++
{
"series": "golang",
"title": "例子"
}
{{ range where .Site.Pages "Params.series" "golang" }}
{{ .Content }}
{{ end }}
也可以与逻辑运算符 !=
、>=
、in
等一起使用。如果没有指定运算符,where
将使用等于号进行比较。
{{ range where .Pages "Section" "!=" "foo" }}
{{ .Content }}
{{ end }}
where
支持以下逻辑运算符:
=
,==
,eq
- 当给定字段的值等于匹配值时为
true
!=
,<>
,ne
- 当给定字段的值不等于匹配值时为
true
>=
,ge
- 当给定字段的值大于或等于匹配值时为
true
>
,gt
- 当给定字段的值大于匹配值时为
true
<=
,le
- 当给定字段的值小于或等于匹配值时为
true
<
,lt
- 当给定字段的值小于匹配值时为
true
in
- 当给定字段的值在匹配值中存在时为
true
;匹配值必须是一个数组或切片 not in
- 当给定字段的值不在匹配值中存在时为
true
;匹配值必须是一个数组或切片 intersect
- 当给定字段的值(为一个字符串或整数的数组或切片)与匹配值有共同的元素时为
true
;遵循与intersect
函数 相同的规则 like
- 当给定字段的值与正则表达式匹配时为
true
。like
操作符用于比较string
值。比较其他数据类型与正则表达式时,将返回false
。
使用布尔值进行 where
筛选
使用布尔值时,请不要添加引号。
{{ range where .Pages "Draft" true }}
<p>{{ .Title }}</p>
{{ end }}
使用 where
与 intersect
{{ range where .Site.Pages "Params.tags" "intersect" .Params.tags }}
{{ if ne .Permalink $.Permalink }}
{{ .Render "summary" }}
{{ end }}
{{ end }}
还可以将 where
子句的返回值保存在变量中:
{{ $v1 := where .Site.Pages "Params.a" "v1" }}
{{ $v2 := where .Site.Pages "Params.b" "v2" }}
{{ $filtered := $v1 | intersect $v2 }}
{{ range $filtered }}
{{ end }}
使用 where
与 like
这个例子匹配以 “ab” 开头的 “foo” 参数相同的页面:
{{ range where site.RegularPages "Params.foo" "like" `^ab` }}
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
{{ end }}
在指定正则表达式时,使用原生的字符串字面量(反引号)而不是解释的字符串字面量(双引号),以简化语法。使用解释的字符串字面量时,必须转义反斜杠。
Go的正则表达式包实现了RE2语法。RE2语法可以理解为对PCRE所接受的语法进行了子集化,并带有一些注意事项。注意,RE2 \C
转义序列不受支持。
使用 where
与 first
将 first
与 where
结合使用可以非常强大。下面的示例从主要章节中获取帖子列表,并使用列表的默认排序(即 weight => date
),然后遍历该列表中的前 5 个帖子:
{{ range first 5 (where site.RegularPages "Type" "in" site.Params.mainSections) }}
{{ .Content }}
{{ end }}
嵌套 where
子句
可以嵌套 where
子句以通过多个参数对内容列表进行进一步筛选。下面的示例首先获取 “blog” 部分的所有页面,然后在第一个 where
子句的结果中遍历,找到所有未被标记为{:.noconvert}特色的页面:
{{ range where (where .Pages "Section" "blog" ) "Params.featured" "!=" true }}
未设置字段
筛选仅适用于已设置的字段。如果要检查字段是否已设置或存在,可以使用操作数 nil
。
这在从大型池中筛选少量页面时非常有用。您可以仅在必要的页面上设置字段,而不是在所有页面上设置字段。
针对 nil
,只有以下运算符可用:
=
,==
,eq
:当给定字段未设置时为true
。!=
,<>
,ne
:当给定字段已设置时为true
。
{{ range where .Pages "Params.specialpost" "!=" nil }}
{{ .Content }}
{{ end }}
便携的 where
筛选器 – site.Params.mainSections
这对于主题来说尤为重要。
在首页或类似页面上列出最相关的页面时,应使用 site.Params.mainSections
列表,而不是将节名称与硬编码的值(如 "posts"
或 "post"
)进行比较。
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
如果用户没有在站点配置中设置此参数,它将默认为页面最多的节。
用户可以更改默认值:
params:
mainSections:
- blog
- docs
[params]
mainSections = ['blog', 'docs']
{
"params": {
"mainSections": [
"blog",
"docs"
]
}
}