การวนซ้ำ (Loop Handling)
การวนซ้ำใช้สำหรับแสดงผลข้อมูลซ้ำๆ จากอาร์เรย์หรืออ็อบเจกต์ โดยการกำหนดจุดเริ่มต้นและจุดสิ้นสุดของการวนซ้ำ เพื่อระบุเนื้อหาที่ต้องการให้ทำซ้ำครับ/ค่ะ ด้านล่างนี้จะอธิบายสถานการณ์ทั่วไปหลายกรณีครับ/ค่ะ
การวนซ้ำอาร์เรย์ (Iterating over Arrays)
1. คำอธิบายไวยากรณ์
- ใช้แท็ก
{d.array[i].property} เพื่อกำหนดรายการที่กำลังวนซ้ำอยู่ และใช้ {d.array[i+1].property} เพื่อระบุรายการถัดไปสำหรับกำหนดขอบเขตการวนซ้ำครับ/ค่ะ
- ในระหว่างการวนซ้ำ ระบบจะใช้บรรทัดแรก (ส่วน
[i]) เป็นเทมเพลตสำหรับการทำซ้ำโดยอัตโนมัติ คุณเพียงแค่ต้องเขียนตัวอย่างการวนซ้ำเพียงครั้งเดียวในเทมเพลตครับ/ค่ะ
รูปแบบไวยากรณ์ตัวอย่าง:
{d.arrayName[i].property}
{d.arrayName[i+1].property}
2. ตัวอย่าง: การวนซ้ำอาร์เรย์แบบง่าย
ข้อมูล
{
"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
3. ตัวอย่าง: การวนซ้ำอาร์เรย์แบบซ้อนกัน
เหมาะสำหรับกรณีที่อาร์เรย์มีการซ้อนอาร์เรย์อยู่ภายใน และสามารถซ้อนกันได้ไม่จำกัดระดับครับ/ค่ะ
ข้อมูล
[
{
"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
4. ตัวอย่าง: การวนซ้ำแบบสองทิศทาง (ฟีเจอร์ขั้นสูง, v4.8.0+)
การวนซ้ำแบบสองทิศทางช่วยให้สามารถวนซ้ำทั้งในแถวและคอลัมน์ได้พร้อมกัน ซึ่งเหมาะสำหรับการสร้างตารางเปรียบเทียบและการจัดวางที่ซับซ้อนอื่นๆ ครับ/ค่ะ (หมายเหตุ: ปัจจุบันบางรูปแบบรองรับเฉพาะในเทมเพลต 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
5. ตัวอย่าง: การเข้าถึงค่าตัววนซ้ำ (Loop Iterator) (v4.0.0+)
ภายในลูป คุณสามารถเข้าถึงค่าดัชนีของการวนซ้ำปัจจุบันได้โดยตรง ซึ่งช่วยให้ตอบสนองความต้องการด้านการจัดรูปแบบพิเศษได้ง่ายขึ้นครับ/ค่ะ
ตัวอย่างเทมเพลต
{d[i].cars[i].other.wheels[i].tire.subObject:add(.i):add(..i):add(...i)}
หมายเหตุ: จำนวนจุดใช้เพื่อระบุระดับของค่าดัชนีที่แตกต่างกัน (เช่น .i แทนระดับปัจจุบัน ส่วน ..i แทนระดับก่อนหน้า) ขณะนี้มีปัญหาเกี่ยวกับการเรียงลำดับย้อนกลับ โปรดดูรายละเอียดในเอกสารทางการครับ/ค่ะ
การวนซ้ำอ็อบเจกต์ (Iterating over Objects)
1. คำอธิบายไวยากรณ์
- สำหรับคุณสมบัติ (property) ในอ็อบเจกต์ คุณสามารถใช้
.att เพื่อรับชื่อคุณสมบัติ และใช้ .val เพื่อรับค่าคุณสมบัติได้ครับ/ค่ะ
- ในระหว่างการวนซ้ำ แต่ละครั้งจะวนซ้ำไปทีละรายการคุณสมบัติครับ/ค่ะ
รูปแบบไวยากรณ์ตัวอย่าง:
{d.objectName[i].att} // ชื่อคุณสมบัติ
{d.objectName[i].val} // ค่าคุณสมบัติ
2. ตัวอย่าง: การวนซ้ำคุณสมบัติของอ็อบเจกต์
ข้อมูล
{
"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
การจัดเรียง (Sorting)
การใช้ฟังก์ชันการจัดเรียง ช่วยให้คุณสามารถจัดเรียงข้อมูลอาร์เรย์ได้โดยตรงภายในเทมเพลตครับ/ค่ะ
1. คำอธิบายไวยากรณ์: การจัดเรียงจากน้อยไปมาก
- ใช้คุณสมบัติเป็นเกณฑ์ในการจัดเรียงภายในแท็กการวนซ้ำ รูปแบบไวยากรณ์คือ:
{d.array[sortingAttribute, i].property}
{d.array[sortingAttribute+1, i+1].property}
- หากต้องการจัดเรียงหลายเกณฑ์ คุณสามารถคั่นคุณสมบัติการจัดเรียงหลายรายการด้วยเครื่องหมายจุลภาคภายในวงเล็บเหลี่ยมได้ครับ/ค่ะ
2. ตัวอย่าง: การจัดเรียงตามคุณสมบัติที่เป็นตัวเลข
ข้อมูล
{
"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
3. ตัวอย่าง: การจัดเรียงหลายคุณสมบัติ
ข้อมูล
{
"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
การกรองข้อมูล (Filtering)
การกรองข้อมูลใช้สำหรับกรองแถวข้อมูลในการวนซ้ำตามเงื่อนไขที่กำหนดครับ/ค่ะ
1. คำอธิบายไวยากรณ์: การกรองข้อมูลตัวเลข
- เพิ่มเงื่อนไขในแท็กการวนซ้ำ (เช่น
age > 19) รูปแบบไวยากรณ์คือ:
{d.array[i, condition].property}
2. ตัวอย่าง: การกรองข้อมูลตัวเลข
ข้อมูล
[
{ "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}
ผลลัพธ์
3. คำอธิบายไวยากรณ์: การกรองข้อมูลสตริง
- ระบุเงื่อนไขสตริงโดยใช้เครื่องหมายอัญประกาศเดี่ยว ตัวอย่างรูปแบบ:
{d.array[i, type='rocket'].name}
4. ตัวอย่าง: การกรองข้อมูลสตริง
ข้อมูล
[
{ "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
5. คำอธิบายไวยากรณ์: การกรองข้อมูล N รายการแรก
- คุณสามารถใช้ดัชนีการวนซ้ำ
i เพื่อกรองเอา N รายการแรกออกมาได้ ตัวอย่างไวยากรณ์:
{d.array[i, i < N].property}
6. ตัวอย่าง: การกรองข้อมูลสองรายการแรก
ข้อมูล
[
{ "name": "Falcon 9" },
{ "name": "Model S" },
{ "name": "Model 3" },
{ "name": "Falcon Heavy" }
]
เทมเพลต
People
{d[i, i < 2].name}
{d[i+1, i < 2].name}
ผลลัพธ์
7. คำอธิบายไวยากรณ์: การยกเว้น N รายการสุดท้าย
- ใช้ดัชนีติดลบ
i เพื่ออ้างถึงรายการจากท้ายสุด เช่น:
{d.array[i=-1].property} ใช้สำหรับเรียกดูรายการสุดท้าย
{d.array[i, i!=-1].property} ใช้สำหรับยกเว้นรายการสุดท้าย
8. ตัวอย่าง: การยกเว้นรายการสุดท้ายและสองรายการสุดท้าย
ข้อมูล
[
{ "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
9. คำอธิบายไวยากรณ์: การกรองข้อมูลอัจฉริยะ
- คุณสามารถซ่อนทั้งแถวได้ตามเงื่อนไขที่ซับซ้อน โดยใช้บล็อกเงื่อนไขอัจฉริยะ ตัวอย่างรูปแบบ:
{d.array[i].property:ifIN('keyword'):drop(row)}
10. ตัวอย่าง: การกรองข้อมูลอัจฉริยะ
ข้อมูล
[
{ "name": "Falcon 9" },
{ "name": "Model S" },
{ "name": "Model 3" },
{ "name": "Falcon Heavy" }
]
เทมเพลต
People
{d[i].name}
{d[i].name:ifIN('Falcon'):drop(row)}
{d[i+1].name}
ผลลัพธ์
(หมายเหตุ: แถวที่มีคำว่า “Falcon” ในเทมเพลตจะถูกลบออกด้วยเงื่อนไขการกรองอัจฉริยะครับ/ค่ะ)
การลบข้อมูลซ้ำ (Deduplication)
1. คำอธิบายไวยากรณ์
- ด้วยการใช้ตัววนซ้ำ (iterator) ที่กำหนดเอง คุณสามารถรับรายการที่ไม่ซ้ำกัน (unique) โดยอิงจากค่าของคุณสมบัติได้ ไวยากรณ์จะคล้ายกับการวนซ้ำทั่วไป แต่จะละเว้นรายการที่ซ้ำกันโดยอัตโนมัติครับ/ค่ะ
ตัวอย่างรูปแบบ:
{d.array[property].property}
{d.array[property+1].property}
2. ตัวอย่าง: การเลือกข้อมูลที่ไม่ซ้ำกัน
ข้อมูล
[
{ "type": "car", "brand": "Hyundai" },
{ "type": "plane", "brand": "Airbus" },
{ "type": "plane", "brand": "Boeing" },
{ "type": "car", "brand": "Toyota" }
]
เทมเพลต
Vehicles
{d[type].brand}
{d[type+1].brand}
ผลลัพธ์