是否可以使用具有嵌套属性的 liquid "where" 数组过滤器?
Is it possible to use a liquid "where" array filter with nested properties?
我正在尝试使用块设置来过滤块数组。我可以使用以下语法按 "type" 等属性进行过滤:
{% assign example = section.blocks | where: "type", "photos" %}
我需要做的是按块设置进行过滤,如下所示:
{% assign example = section.blocks | where: settings.collection, collection.handle %}
上面的例子失败了。
备注: 目前我正在使用带有 for 循环和 if 语句的捕获来完成我需要的工作,然后使用拆分进行分配 — 但代码太臃肿了,并为一个简单的过滤操作做所有这些似乎很荒谬。我发现自己一直觉得自己在与液体作斗争,我想我希望它能比我认为的更优雅一点。
你做错了。 where
仅适用于根元素。在您的情况下 section.blocks
是根元素,因此 where
可用于 section.blocks.abcd_property
.
之类的东西
粗略示例: {% assign example = section.blocks | where: 'collection', collection.handle %}
将加载所有具有 集合的部分块 属性 作为 collection.handle值
这会起作用
{% if settings.collection == collection.handle %}
{% assign example = section.blocks %}
{% else %}
{% assign example = '' | split: '' %}
{% endif %}
我对 Ruby 了解不多,但您 can't pass nested properties with dot notation to the where
filter. However, after seeing people accessing nested values using map
, I tested mixing the two, and the map filter 似乎很适合这种情况。
我的块中有一个名为 default
的布尔设置,我得到了最后一个块的设置对象 default
设置为 true
使用这个:
{% assign obj = section.blocks | map: 'settings' | where: 'default' | last %}
当然,那么您将无法在提取的设置对象之外获取数据。为此,我认为您确实需要遍历 section.blocks
并使用 if
标签手动查找过滤器。
以前使用的 map
会丢失外部数据,但发现字符串表示法与 where
一起用于嵌套属性:
例如,使用 posts
集合,其中每个 .md
文件都有前言:
header:
isArchived: true
以下 liquid
片段通过 header.isArchived
过滤存档帖子:
{% assign archived = site.posts | where: "header.isArchived", true %}
我正在尝试使用块设置来过滤块数组。我可以使用以下语法按 "type" 等属性进行过滤:
{% assign example = section.blocks | where: "type", "photos" %}
我需要做的是按块设置进行过滤,如下所示:
{% assign example = section.blocks | where: settings.collection, collection.handle %}
上面的例子失败了。
备注: 目前我正在使用带有 for 循环和 if 语句的捕获来完成我需要的工作,然后使用拆分进行分配 — 但代码太臃肿了,并为一个简单的过滤操作做所有这些似乎很荒谬。我发现自己一直觉得自己在与液体作斗争,我想我希望它能比我认为的更优雅一点。
你做错了。 where
仅适用于根元素。在您的情况下 section.blocks
是根元素,因此 where
可用于 section.blocks.abcd_property
.
粗略示例: {% assign example = section.blocks | where: 'collection', collection.handle %}
将加载所有具有 集合的部分块 属性 作为 collection.handle值
这会起作用
{% if settings.collection == collection.handle %}
{% assign example = section.blocks %}
{% else %}
{% assign example = '' | split: '' %}
{% endif %}
我对 Ruby 了解不多,但您 can't pass nested properties with dot notation to the where
filter. However, after seeing people accessing nested values using map
, I tested mixing the two, and the map filter 似乎很适合这种情况。
我的块中有一个名为 default
的布尔设置,我得到了最后一个块的设置对象 default
设置为 true
使用这个:
{% assign obj = section.blocks | map: 'settings' | where: 'default' | last %}
当然,那么您将无法在提取的设置对象之外获取数据。为此,我认为您确实需要遍历 section.blocks
并使用 if
标签手动查找过滤器。
以前使用的 map
会丢失外部数据,但发现字符串表示法与 where
一起用于嵌套属性:
例如,使用 posts
集合,其中每个 .md
文件都有前言:
header:
isArchived: true
以下 liquid
片段通过 header.isArchived
过滤存档帖子:
{% assign archived = site.posts | where: "header.isArchived", true %}