如何在Twig中实现类似JS Array.every()的数组全包含校验?
纯Twig实现多标签“与”匹配(等效JavaScript的array.every())
你可以用Twig的reduce过滤器来实现更简洁的“所有标签都匹配”逻辑,完全替代你现在的繁琐写法:
{% set given_tags_array = data.tags|split(',') %} {% for post in posts %} {% set post_category_names = post.categories|map(cat => cat.name) %} {% set has_all_tags = given_tags_array|reduce((carry, tag) => carry and (tag in post_category_names), true) %} {% if has_all_tags %} {# 这里渲染你的文章内容 #} {% endif %} {% endfor %}
逻辑说明:
reduce的初始值设为true,代表默认所有标签都匹配- 遍历每个给定标签时,用
carry and (tag in post_category_names)更新结果:只要有一个标签不在文章分类里,carry就会变成false,且后续不会再变回true - 最终
has_all_tags就是是否满足所有标签都存在的布尔值,完全等效JavaScript的array.every()
为什么你之前的方法有问题:
- 你尝试的
filter写法会返回所有匹配的标签,Twig里非空数组会被判定为true,所以只要有一个标签匹配就会显示文章,实现的是“或”逻辑而非“与”逻辑 - 你最初的布尔数组方法虽然可行,但需要额外的循环和数组操作,代码冗余且可读性差
内容的提问来源于stack exchange,提问作者salat69
相关产品推荐
相关产品推荐

