mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-20 11:20:41 -07:00
Add where filter to standard filters
Users of Liquid will often wish to filter an array to only those items that match a certain criteria. For example, showing "pinned" messages at the top of a list.
Example usage:
`{{ comments | where: "pinned" | first }}`
or
`{{ products | where: "category", "kitchen" }}`
* Add where filter to standard filters
* Add tests for new where functionality
This commit is contained in:
@@ -151,6 +151,20 @@ module Liquid
|
||||
end
|
||||
end
|
||||
|
||||
# Filter the elements of an array to those with a certain property value.
|
||||
# By default the target is any truthy value.
|
||||
def where(input, property, target_value = nil)
|
||||
ary = InputIterator.new(input)
|
||||
|
||||
if ary.empty?
|
||||
[]
|
||||
elsif ary.first.respond_to?(:[]) && target_value.nil?
|
||||
ary.where_present(property)
|
||||
elsif ary.first.respond_to?(:[])
|
||||
ary.where(property, target_value)
|
||||
end
|
||||
end
|
||||
|
||||
# Remove duplicate elements from an array
|
||||
# provide optional property with which to determine uniqueness
|
||||
def uniq(input, property = nil)
|
||||
@@ -429,6 +443,24 @@ module Liquid
|
||||
yield(e.respond_to?(:to_liquid) ? e.to_liquid : e)
|
||||
end
|
||||
end
|
||||
|
||||
def where(property, target_value)
|
||||
select do |item|
|
||||
item[property] == target_value
|
||||
end
|
||||
rescue TypeError
|
||||
# Cannot index with the given property type (eg. indexing integers with strings
|
||||
# which are only allowed to be indexed by other integers).
|
||||
raise ArgumentError.new("cannot select the property `#{property}`")
|
||||
end
|
||||
|
||||
def where_present(property)
|
||||
select { |item| item[property] }
|
||||
rescue TypeError
|
||||
# Cannot index with the given property type (eg. indexing integers with strings
|
||||
# which are only allowed to be indexed by other integers).
|
||||
raise ArgumentError.new("cannot select the property `#{property}`")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user