是否可以使用具有嵌套属性的液体“where”数组过滤器?

Posted

技术标签:

【中文标题】是否可以使用具有嵌套属性的液体“where”数组过滤器?【英文标题】:Is it possible to use a liquid "where" array filter with nested properties? 【发布时间】:2020-01-05 00:22:37 【问题描述】:

我正在尝试使用块设置过滤一组块。我可以使用以下语法按“类型”等属性进行过滤:

% assign example = section.blocks | where: "type", "photos" %

我需要做的是按块设置过滤,如下所示:

% assign example = section.blocks | where: settings.collection, collection.handle %

上面的例子无声无息地失败了。

注意:目前我正在使用带有 for 循环和 if 语句的捕获来完成我需要的工作,然后使用 split 进行分配——但是代码太臃肿了,并且正在做所有这些对于一个简单的过滤操作似乎很荒谬。我发现自己经常感觉自己在与液体作斗争,我想我希望它可能比我想象的要优雅一点。

【问题讨论】:

【参考方案1】:

以前使用的map 会丢失外部数据,但发现字符串表示法适用于嵌套属性的where

例如,使用 posts 集合,其中每个 .md 文件都有前端:

header:
    isArchived: true

以下liquid sn-p 过滤通过header.isArchived 归档的帖子:

% assign archived = site.posts | where: "header.isArchived", true %

【讨论】:

【参考方案2】:

我对 Ruby 了解不多,但您 can't 似乎将带有点符号的嵌套属性传递给 where 过滤器。但是,在seeing people 使用map 访问嵌套值之后,我测试了将两者混合,map filter 似乎适用于这种情况。

我在我的块中有一个名为 default 的布尔设置,我得到了最后一个块的设置对象,其中 default 设置为 true 使用这个:

% assign obj = section.blocks | map: 'settings' | where: 'default' | last %

当然,您无法在提取的设置对象之外获取数据。为此,我认为您确实需要遍历 section.blocks 并使用 if 标签手动查找过滤器。

【讨论】:

【参考方案3】:

你做错了。 where 仅在根元素上有效。在您的情况下,section.blocks 是根元素,因此 where 可以用于类似 section.blocks.abcd_property 的内容。

粗略示例:% assign example = section.blocks | where: 'collection', collection.handle % 将加载所有具有 collection 属性的部分块作为 collection.handle 值

这会起作用

% if settings.collection == collection.handle  %
% assign example = section.blocks %
% else %
% assign example = '' | split: '' %
% endif %

【讨论】:

谢谢 - 这回答了我的问题。我希望液体允许使用具有嵌套属性的 where 数组过滤器,但我猜不是。我也没有“做错了”。就像我在我的问题中所说的那样,我的工作原理与您建议的基本相同。我希望液体中有一种语法允许将嵌套属性与“位置”进行比较——一个简单的“否”就足够了。

以上是关于是否可以使用具有嵌套属性的液体“where”数组过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

用具有多个索引的数组填充表[重复]

PHP 数组 - 'set where key=?'类型函数?

是否可以使用具有两列的表视图创建 UI?

如何使用javascript在嵌套对象数组中按属性分配值

可变数组(PLSQL)

液体彩虹脚本颜色变化