如何通过属性值获取单个Flex Object?替代Flex Collection的search()
通过属性值获取单个Grav Flex Object
核心结论
Flex Object的search()方法无法直接用来查询获取单个对象,它仅能在已获取的对象上验证属性是否匹配指定条件,而非从集合中检索对象。要通过属性值获取单个对象,需先操作Flex Collection,再从中提取目标对象。
具体实现方案
1. 用search()筛选集合后取首个对象
先通过Flex Collection的search()方法筛选出匹配集合,再调用first()获取第一个匹配对象:
{% set contacts_collection = grav.get('flex').collection('contacts') %} {% set contact = contacts_collection.search('Michael', ['first_name'], {'contains': true}).first() %}
2. 用filter()自定义筛选逻辑
如果需要更灵活的匹配规则,可使用filter()方法自定义判断逻辑:
{% set contacts_collection = grav.get('flex').collection('contacts') %} {% set contact = contacts_collection.filter(function(item) { return item.first_name contains 'Michael'; }).first() %}
3. 用find()做精确匹配
若需精确匹配属性值,find()方法效率更高,默认返回第一个匹配对象:
{% set contacts_collection = grav.get('flex').collection('contacts') %} {% set contact = contacts_collection.find({first_name: 'Michael'}) %}
注意:即便存在多个匹配项,
find()也只会返回第一个结果。
关于Flex Object的search()方法
你的理解是正确的,该方法仅适用于已获取的单个Flex Object,用来验证其属性是否包含指定内容,示例如下:
{% set contact = grav.get('flex').object('gizwsvkyo5xtms2s', 'contacts') %} {# 验证当前联系人的first_name是否包含Michael #} {% if contact.search('Michael', ['first_name'], {'contains': true}) %} <p>该联系人名字包含Michael</p> {% endif %}
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

