Jekyll/Liquid中无需循环查找数组元素位置的方法
在Jekyll/Liquid中不使用循环查找数组元素位置
嘿,好问题!确实,Liquid(Jekyll默认的模板语言)并没有像Java那样原生自带indexOf()方法来直接返回数组元素的索引,但咱可以用它的内置过滤器组合出完全符合你要求的效果——不用写任何循环和循环内的条件判断。
核心实现思路
利用Liquid的join、split和size过滤器,通过字符串分割的方式间接计算元素位置,具体步骤和示例如下:
示例代码
假设我们有一个普通数组,想要查找某个元素的位置:
{% assign fruits = "apple,banana,cherry,dates" | split: "," %} {% assign target_element = "cherry" %} {% comment %} 可选:先检查元素是否存在,避免不存在时返回误导性结果 {% endcomment %} {% if fruits contains target_element %} {% assign separator = "|||" %} {% comment %} 选一个不会出现在元素里的特殊分隔符 {% endcomment %} {% assign joined_str = fruits | join: separator %} {% assign split_part = joined_str | split: target_element | first %} {% assign element_index = split_part | split: separator | size %} 目标元素 "{{ target_element }}" 的位置是: {{ element_index }} {% comment %} 输出2,Liquid数组索引从0开始 {% endcomment %} {% else %} 目标元素 "{{ target_element }}" 不在数组中 {% endif %}
逻辑拆解
join: separator:把数组元素用自定义的特殊分隔符拼接成字符串,比如将["apple", "banana", "cherry"]转为apple|||banana|||cherrysplit: target_element:用目标元素分割拼接后的字符串,取分割结果的第一个部分——这部分就是目标元素之前的所有内容split: separator:把前半部分内容再用同样的分隔符拆分,得到目标元素之前的所有元素组成的数组size:取这个数组的长度,就是目标元素在原数组中的索引(因为索引从0开始,长度刚好等于索引值)
注意事项
- 必须选择一个绝对不会出现在数组元素中的分隔符,比如
|||、###这类特殊组合,避免因为元素本身包含分隔符导致分割出错 - 如果不需要检查元素是否存在,直接执行核心计算逻辑即可,但此时若元素不存在,会返回原数组的长度,需根据场景判断是否需要提前用
contains做检查
内容的提问来源于stack exchange,提问作者javito
相关产品推荐
相关产品推荐

