Is It Possible To Use A Liquid "where" Array Filter With Nested Properties?

- 1 answer

I'm trying to filter an array of blocks using block settings. I can filter by properties like "type" using the following syntax:

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

What I need to do is filter by block settings, something like this:

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

The above example is failing silently.

A note: Currently I am accomplishing what I need using a capture with a for loop and an if statement, and then assigning with a split — but the code is so bloated, and doing all that for a simple filter operation seems ridiculous. I find myself constantly feeling like I'm fighting with liquid, and I guess I'm hoping it might be just a bit more elegant than I'm giving it credit for.



I don't know much about Ruby, but it seems you 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 seems to work well for this case.

I have a boolean setting called default in my blocks, and I got the settings object for the last block with default set to true using this:

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

Of course, then you can't get data outside of the settings object that was extracted. For that I think you really would need to loop through the section.blocks and find filter manually using the if tag.