Liquid中是否支持类似JavaScript的链式||(或)表达式语法?
在Liquid中实现JS式的短路优先取值逻辑
当然有啦!Liquid 里完全能用单行代码搞定你要的这种「优先取name,没有就降级到nickname,最后用'-'兜底」的逻辑,根本不用写一堆繁琐的if/elseif语句,下面给你两种常用的简洁写法:
方法1:链式调用 default 过滤器
Liquid 的 default 过滤器就是专门用来处理“值为空/不存在时用默认值”的场景,咱们把它链式起来就能实现多级降级:
{{ person.name | default: person.nickname | default: '-' }}
它的运行逻辑很清晰:
- 先看
person.name,只要它不是nil或者false,就直接用这个值; - 如果
person.name是nil/false,就转而使用person.nickname; - 要是
person.nickname也不符合要求,最后就用-兜底。
小补充:如果你的场景里空字符串也需要被替换,可以给
default加第二个参数true,比如{{ person.name | default: person.nickname, true | default: '-', true }},这样空字符串也会触发降级逻辑。
方法2:使用 or 逻辑运算符
Liquid 也支持 or 运算符,和 JavaScript 里的 || 行为非常类似,同样能实现单行的短路求值:
{{ person.name or person.nickname or '-' }}
这个写法的逻辑是从左到右找第一个「真值」:
- 只要
person.name是真值(不是nil、false、空字符串、空数组这类假值),就直接返回它; - 如果
person.name是假值,就看person.nickname; - 要是前面两个都是假值,最后就返回
-。
两种写法的细微差异
- 如果你的业务里空字符串是合法值需要保留,那用不带第二个参数的
default过滤器更合适——它不会替换空字符串; - 如果空字符串也需要被降级替换,那
or运算符会更直接,因为它把空字符串判定为假值,会自动往后找下一个值。
内容的提问来源于stack exchange,提问作者V. Rubinetti
相关产品推荐
相关产品推荐

