You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Twig模板中对数组先按lname再按name排序?

当然可以直接在Twig模板里搞定这个排序需求!

完全不需要在传入模板前提前排序或者创建自定义扩展,Twig本身就支持通过sort过滤器结合自定义比较逻辑来实现多字段排序。

推荐实现(Twig 2.12+ 版本)

从Twig 2.12开始支持箭头函数,写法简洁直观:

{% set temp = [ 
    {"name": 'Tom', 'lname': 'Marko'}, 
    {"name": 'Nick', 'lname': 'Montana'}, 
    {"name": 'Tina', 'lname': 'Marko'}, 
    {"name": 'Mike', 'lname': 'Miles'} 
] %}

{% set sortedTemp = temp|sort((a, b) => 
    a.lname <=> b.lname ?: a.name <=> b.name
) %}

逻辑说明

  • <=> 是Twig的太空船运算符,用来比较两个值:返回-1(前者更小)、0(两者相等)、1(前者更大)
  • 先比较lname字段,如果两个元素的姓氏相同(返回0),则通过?:运算符继续比较name字段,完美实现「先按姓氏排序,姓氏相同再按名字排序」的需求。

旧版本Twig(低于2.12)兼容写法

如果你的Twig版本不支持箭头函数,用匿名函数也能实现:

{% set sortedTemp = temp|sort(function(a, b) {
    if (a.lname != b.lname) {
        return a.lname < b.lname ? -1 : 1;
    }
    return a.name < b.name ? -1 : 1;
}) %}

最终效果

两种写法得到的sortedTemp都会和你预期的结果完全一致:

[ 
    {"name": 'Tina', 'lname': 'Marko'}, 
    {"name": 'Tom', 'lname': 'Marko'}, 
    {"name": 'Mike', 'lname': 'Miles'}, 
    {"name": 'Nick', 'lname': 'Montana'} 
]

内容的提问来源于stack exchange,提问作者user11005120

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:07:28