是否可以使用具有嵌套属性的 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 %}