docs/docs/cn/template-print/syntax/loops.md
循环处理用于对数组或对象中的数据进行重复渲染,通过定义循环起始和结束标记来识别需要重复的内容。下面介绍常见的几种情况。
{d.array[i].属性} 定义当前循环项,用 {d.array[i+1].属性} 指定下一项以标识循环区域。[i] 部分)作为模板进行重复;模板中只需写一次循环示例即可。示例语法格式:
{d.数组名[i].属性}
{d.数组名[i+1].属性}
{
"cars": [
{ "brand": "Toyota", "id": 1 },
{ "brand": "Hyundai", "id": 2 },
{ "brand": "BMW", "id": 3 },
{ "brand": "Peugeot","id": 4 }
]
}
Carsid
{d.cars[i].brand}{d.cars[i].id}
{d.cars[i+1].brand}
Carsid
Toyota1
Hyundai2
BMW3
Peugeot4
适用于数组内嵌套数组的情况,可以无限层级嵌套。
[
{
"brand": "Toyota",
"models": [
{ "size": "Prius 4", "power": 125 },
{ "size": "Prius 5", "power": 139 }
]
},
{
"brand": "Kia",
"models": [
{ "size": "EV4", "power": 450 },
{ "size": "EV6", "power": 500 }
]
}
]
{d[i].brand}
Models
{d[i].models[i].size} - {d[i].models[i].power}
{d[i].models[i+1].size}
{d[i+1].brand}
Toyota
Models
Prius 4 - 125
Prius 5 - 139
Kia
双向循环可同时在行和列上进行迭代,适用于生成对比表等复杂布局(注:部分格式目前仅 DOCX、HTML、MD 模板官方支持)。
{
"titles": [
{ "name": "Kia" },
{ "name": "Toyota" },
{ "name": "Hopium" }
],
"cars": [
{ "models": [ "EV3", "Prius 1", "Prototype" ] },
{ "models": [ "EV4", "Prius 2", "" ] },
{ "models": [ "EV6", "Prius 3", "" ] }
]
}
{d.titles[i].name}{d.titles[i+1].name}
{d.cars[i].models[i]}{d.cars[i].models[i+1]}
{d.cars[i+1].models[i]}
KiaToyotaHopium
EV3Prius 1Prototype
EV4Prius 2
EV6Prius 3
在循环中可以直接访问当前迭代的索引值,便于实现特殊格式需求。
{d[i].cars[i].other.wheels[i].tire.subObject:add(.i):add(..i):add(...i)}
注:点号的数量用于表示不同层级的索引值(例如,
.i表示当前层,..i表示上一层),当前存在逆序问题,详情参阅官方说明。
.att 获取属性名称,使用 .val 获取属性值。示例语法格式:
{d.对象名[i].att} // 属性名称
{d.对象名[i].val} // 属性值
{
"myObject": {
"paul": "10",
"jack": "20",
"bob": "30"
}
}
People namePeople age
{d.myObject[i].att}{d.myObject[i].val}
{d.myObject[i+1].att}{d.myObject[i+1].val}
People namePeople age
paul10
jack20
bob30
利用排序功能可以在模板中直接对数组数据进行排序。
{d.array[排序属性, i].属性}
{d.array[排序属性+1, i+1].属性}
{
"cars": [
{ "brand": "Ferrari", "power": 3 },
{ "brand": "Peugeot", "power": 1 },
{ "brand": "BMW", "power": 2 },
{ "brand": "Lexus", "power": 1 }
]
}
Cars
{d.cars[power, i].brand}
{d.cars[power+1, i+1].brand}
Cars
Peugeot
Lexus
BMW
Ferrari
{
"cars": [
{ "brand": "Ferrari", "power": 3, "sub": { "size": 1 } },
{ "brand": "Aptera", "power": 1, "sub": { "size": 20 } },
{ "brand": "Peugeot", "power": 1, "sub": { "size": 20 } },
{ "brand": "BMW", "power": 2, "sub": { "size": 1 } },
{ "brand": "Kia", "power": 1, "sub": { "size": 10 } }
]
}
Cars
{d.cars[power, sub.size, i].brand}
{d.cars[power+1, sub.size+1, i+1].brand}
Cars
Kia
Aptera
Peugeot
BMW
Ferrari
筛选处理用于根据特定条件过滤循环中的数据行。
age > 19),语法格式:
{d.array[i, 条件].属性}
[
{ "name": "John", "age": 20 },
{ "name": "Eva", "age": 18 },
{ "name": "Bob", "age": 25 },
{ "name": "Charly", "age": 30 }
]
People
{d[i, age > 19, age < 30].name}
{d[i+1, age > 19, age < 30].name}
People
John
Bob
{d.array[i, type='rocket'].name}
[
{ "name": "Falcon 9", "type": "rocket" },
{ "name": "Model S", "type": "car" },
{ "name": "Model 3", "type": "car" },
{ "name": "Falcon Heavy","type": "rocket" }
]
People
{d[i, type='rocket'].name}
{d[i+1, type='rocket'].name}
People
Falcon 9
Falcon Heavy
i 过滤出前 N 个元素,语法示例:
{d.array[i, i < N].属性}
[
{ "name": "Falcon 9" },
{ "name": "Model S" },
{ "name": "Model 3" },
{ "name": "Falcon Heavy" }
]
People
{d[i, i < 2].name}
{d[i+1, i < 2].name}
People
Falcon 9
Model S
i 表示倒数项,例如:
{d.array[i=-1].属性} 获取最后一项{d.array[i, i!=-1].属性} 排除最后一项[
{ "name": "Falcon 9" },
{ "name": "Model S" },
{ "name": "Model 3" },
{ "name": "Falcon Heavy" }
]
最后一项: {d[i=-1].name}
排除最后一项:
{d[i, i!=-1].name}
{d[i+1, i!=-1].name}
排除最后两项:
{d[i, i<-2].name}
{d[i+1, i<-2].name}
最后一项: Falcon Heavy
排除最后一项:
Falcon 9
Model S
Model 3
排除最后两项:
Falcon 9
Model S
示例格式:
{d.array[属性].属性}
{d.array[属性+1].属性}
[
{ "type": "car", "brand": "Hyundai" },
{ "type": "plane", "brand": "Airbus" },
{ "type": "plane", "brand": "Boeing" },
{ "type": "car", "brand": "Toyota" }
]
Vehicles
{d[type].brand}
{d[type+1].brand}
Vehicles
Hyundai
Airbus