Jinja模板groupby分组后按数组索引而非字母顺序排序问题
解决方案
Twig 内置的 groupby 过滤器默认会对分组键按照字母顺序自动排序,没有内置参数可以直接关闭这个特性,要保留原数组中标题首次出现的顺序,手动实现分组逻辑即可,修改后的代码如下:
{% set list = widget.attributes.faq_item %} {# 分别存储分组的顺序、分组对应的内容列表 #} {% set group_order = [] %} {% set grouped_data = {} %} {% for item in list %} {% set current_title = item.value.main_title %} {# 遇到首次出现的标题就新增到分组顺序列表,同时初始化对应分组 #} {% if current_title not in group_order %} {% set group_order = group_order|merge([current_title]) %} {% set grouped_data = grouped_data|merge({(current_title): []}) %} {% endif %} {# 将当前项推入对应标题的分组中 #} {% set grouped_data = grouped_data|merge({(current_title): grouped_data[current_title]|merge([item])}) %} {% endfor %} {# 按原始数组的标题顺序输出分组内容 #} {% for title in group_order %} <h2 class="account-sss__title">{{title}}</h2> {% for item in grouped_data[title] %} <a href="#" class="account-sss__list--link js-link"> {{item.value.question}} </a> <div class="account-sss__content js-account-sss__content"> {{item.value.answer}} </div> {% endfor %} {% endfor %}
这个方案不需要依赖任何额外的Twig扩展,完全按照原始数组中标题第一次出现的顺序排列分组,不会触发默认的字母排序逻辑,适配绝大多数Twig运行环境。
内容的提问来源于stack exchange,提问作者ugurK
相关产品推荐
相关产品推荐

