ตัวกรองช่วยให้คุณสามารถปรับเปลี่ยน[[ตัวแปร|ตัวแปร]]ใน[[Obsidian Web Clipper/เทมเพลต|เทมเพลต Web Clipper]] ตัวกรองจะถูกนำไปใช้กับตัวแปรโดยใช้ไวยากรณ์ `{{variable|filter}}`
- ตัวกรองทำงานได้กับ[[ตัวแปร|ตัวแปร]]ทุกชนิด รวมถึงตัวแปร `prompt`, `meta`, `selector` และ `schema`
- ตัวกรองสามารถต่อเรียงกันได้ เช่น `{{variable|filter1|filter2}}` และจะถูกนำไปใช้ตามลำดับที่เพิ่มเข้าไป
## วันที่
แปลงและปรับเปลี่ยนวันที่
### `date`
แปลงวันที่เป็นรูปแบบที่ระบุ [ดูข้อมูลอ้างอิง](https://day.js.org/docs/en/display/format)
- `{{date|date:"YYYY-MM-DD"}}` แปลงวันที่ปัจจุบันเป็น "YYYY-MM-DD"
- ใช้ `date:("outputFormat", "inputFormat")` เพื่อระบุรูปแบบอินพุต เช่น `"12/01/2024"|date:("YYYY-MM-DD", "MM/DD/YYYY")` แปลง "12/01/2024" และคืนค่า `"2024-12-01"`
### `date_modify`
ปรับเปลี่ยนวันที่โดยการเพิ่มหรือลบระยะเวลาที่ระบุ [ดูข้อมูลอ้างอิง](https://day.js.org/docs/en/manipulate/add)
- `"2024-12-01"|date_modify:"+1 year"` คืนค่า `"2025-12-01"`
- `"2024-12-01"|date_modify:"- 2 months"` คืนค่า `"2024-10-01"`
### `duration`
แปลงสตริงระยะเวลา ISO 8601 หรือวินาทีเป็นสตริงเวลาที่จัดรูปแบบแล้ว ใช้โทเค็น: `HH` (ชั่วโมงแบบเติมศูนย์), `H` (ชั่วโมง), `mm` (นาทีแบบเติมศูนย์), `m` (นาที), `ss` (วินาทีแบบเติมศูนย์), `s` (วินาที)
- `"PT1H30M"|duration:"HH:mm:ss"` คืนค่า `"01:30:00"`
- `"3665"|duration:"H:mm:ss"` คืนค่า `"1:01:05"`
- การตั้งค่า `duration` โดยไม่มีพารามิเตอร์จะใช้ `HH:mm:ss` เมื่อเกิน 1 ชั่วโมง และ `mm:ss` เมื่อต่ำกว่า 1 ชั่วโมง
- รองรับทั้งสตริงระยะเวลา ISO 8601 (เช่น `PT6702S`, `PT1H30M`) และวินาทีแบบธรรมดา
## การแปลงและการใช้ตัวพิมพ์ของข้อความ
แปลงสตริงข้อความจากรูปแบบหนึ่งเป็นอีกรูปแบบหนึ่ง
### `camel`
แปลงข้อความเป็น `camelCase`
### `capitalize`
ทำให้ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่และแปลงส่วนที่เหลือเป็นตัวพิมพ์เล็ก เช่น `"hELLO wORLD"|capitalize` คืนค่า `"Hello world"`
### `decode_uri`
ถอดรหัสสตริงที่เข้ารหัส URI เช่น `"%E4%BD%A0%E5%A5%BD"|decode_uri` คืนค่า `"你好"`
- `"hello%20world"|decode_uri` คืนค่า `"hello world"`
- คืนค่าสตริงเดิมหากถอดรหัสไม่สำเร็จ (เช่น ลำดับ URI ที่ไม่ถูกต้อง)
### `kebab`
แปลงข้อความเป็น `kebab-case`
### `lower`
แปลงข้อความเป็น `lowercase`
### `pascal`
แปลงข้อความเป็น `PascalCase`
### `replace`
แทนที่ข้อความที่ระบุ:
- การแทนที่แบบง่าย: `"hello!"|replace:",":""` ลบเครื่องหมายจุลภาคทั้งหมด
- การแทนที่หลายรายการ: `"hello world"|replace:("e":"a","o":"0")` คืนค่า `"hall0 w0rld"`
- การแทนที่จะถูกนำไปใช้ตามลำดับที่ระบุ
- ใช้ `""` เป็นค่าแทนที่เพื่อลบข้อความที่ระบุ
- อักขระพิเศษรวมถึง `: | { } ( ) ' "` ควรใส่แบ็กสแลชนำหน้าเมื่อใช้ในคำค้นหา เช่น `\:` เพื่อค้นหาเครื่องหมายโคลอน
รองรับนิพจน์ทั่วไปโดยใช้ไวยากรณ์ regex ของ JavaScript:
- แทนที่สระทั้งหมด: `"hello world"|replace:"/[aeiou]/g":"*"` → `"h*ll* w*rld"`
- ไม่คำนึงถึงตัวพิมพ์: `"HELLO world"|replace:"/hello/i":"hi"` → `"hi world"`
- นิพจน์ทั่วไปหลายรายการ: `"hello world"|replace:("/[aeiou]/g":"*","/\s+/":"-")` → `"h*ll*-w*rld"`
- แฟล็กที่ใช้ได้: `g` (ทั่วไป), `i` (ไม่คำนึงถึงตัวพิมพ์), `m` (หลายบรรทัด), `s` (dotAll), `u` (unicode), `y` (sticky)
### `safe_name`
แปลงข้อความเป็นชื่อไฟล์ที่ปลอดภัย
- โดยค่าเริ่มต้น `safe_name` จะใช้กฎการทำความสะอาดที่เข้มงวดที่สุด
- สามารถใช้กฎเฉพาะระบบปฏิบัติการได้ด้วย `safe_name:os` โดย `os` สามารถเป็น `windows`, `mac` หรือ `linux` เพื่อใช้กฎสำหรับระบบปฏิบัติการนั้นเท่านั้น
### `snake`
แปลงข้อความเป็น `snake_case`
### `title`
แปลงข้อความเป็น `Title Case` เช่น `"hello world"|title` คืนค่า `"Hello World"`
### `trim`
ลบช่องว่างจากทั้งสองด้านของสตริง
- `" hello world "|trim` คืนค่า `"hello world"`
### `uncamel`
แปลง camelCase หรือ PascalCase เป็นคำที่คั่นด้วยช่องว่าง ซึ่งคุณสามารถจัดรูปแบบเพิ่มเติมด้วยตัวกรองอื่น เช่น `title` หรือ `capitalize`
- `"camelCase"|uncamel` คืนค่า `"camel case"`
- `"PascalCase"|uncamel` คืนค่า `"pascal case"`
### `upper`
แปลงค่าเป็นตัวพิมพ์ใหญ่ เช่น `"hello world"|upper` คืนค่า `"HELLO WORLD"`
## การจัดรูปแบบข้อความ
ใช้[[ไวยากรณ์การจัดรูปแบบพื้นฐาน]]และ[[ไวยากรณ์การจัดรูปแบบขั้นสูง]]กับข้อความ
### `blockquote`
เพิ่มคำนำหน้าคำคม Markdown (`> `) ในแต่ละบรรทัดของอินพุต
### `callout`
สร้าง[[บล็อกเน้น|บล็อกเน้น]]พร้อมพารามิเตอร์เสริม: `{{variable|callout:("type", "title", foldState)}}`
- `type` คือประเภทบล็อกเน้น มีค่าเริ่มต้นเป็น "info"
- `title` คือชื่อบล็อกเน้น มีค่าเริ่มต้นเป็นว่าง
- `foldState` คือค่าบูลีนสำหรับตั้งค่าสถานะการพับ (true สำหรับพับ, false สำหรับขยาย, null สำหรับไม่สามารถพับได้)
### `footnote`
แปลงอาร์เรย์หรืออ็อบเจกต์เป็นรายการเชิงอรรถ Markdown
- สำหรับอาร์เรย์: `["first item","second item"]|footnote` คืนค่า: `[^1]: first item` เป็นต้น
- สำหรับอ็อบเจกต์: `{"First Note": "Content 1", "Second Note": "Content 2"}|footnote` คืนค่า: `[^first-note]: Content 1` เป็นต้น
### `fragment_link`
แปลงสตริงและอาร์เรย์เป็นลิงก์ [text fragment](https://developer.mozilla.org/en-US/docs/Web/URI/Fragment/Text_fragments) มีค่าเริ่มต้นเป็น "link" สำหรับข้อความลิงก์
- `highlights|fragment_link` คืนค่า `Highlight content [link](text-fragment-url)`
- `highlights|fragment_link:"custom title"` คืนค่า `Highlight content [custom title](text-fragment-url)`
### `image`
แปลงสตริง อาร์เรย์ หรืออ็อบเจกต์เป็นไวยากรณ์รูปภาพ Markdown
- สำหรับสตริง: `"image.jpg"|image:"alt text"` คืนค่า ``
- สำหรับอาร์เรย์: `["image1.jpg","image2.jpg"]|image:"alt text"` คืนค่าอาร์เรย์ของสตริงรูปภาพ Markdown ที่มีข้อความ alt เดียวกันสำหรับรูปภาพทั้งหมด
- สำหรับอ็อบเจกต์: `{"image1.jpg": "Alt 1", "image2.jpg": "Alt 2"}|image` คืนค่าสตริงรูปภาพ Markdown ที่มีข้อความ alt จากคีย์ของอ็อบเจกต์
### `link`
แปลงสตริง อาร์เรย์ หรืออ็อบเจกต์เป็นไวยากรณ์ลิงก์ Markdown (ไม่ควรสับสนกับ [[ตัวกรอง#`wikilink`|wikilink]])
- สำหรับสตริง: `"url"|link:"author"` คืนค่า `[author](url)`
- สำหรับอาร์เรย์: `["url1","url2"]|link:"author"` คืนค่าอาร์เรย์ของลิงก์ Markdown ที่มีข้อความเดียวกันสำหรับลิงก์ทั้งหมด
- สำหรับอ็อบเจกต์: `{"url1": "Author 1", "url2": "Author 2"}|link` คืนค่าลิงก์ Markdown ที่มีข้อความตรงกับคีย์ของอ็อบเจกต์
### `list`
แปลงอาร์เรย์เป็นรายการ Markdown
- `list` เพื่อแปลงเป็นรายการสัญลักษณ์แสดงหัวข้อย่อย
- `list:task` เพื่อแปลงเป็นรายการงาน
- `list:numbered` เพื่อแปลงเป็นรายการแบบลำดับเลข
- `list:numbered-task` เพื่อแปลงเป็นรายการงานแบบลำดับเลข
### `table`
แปลงอาร์เรย์หรืออาร์เรย์ของอ็อบเจกต์เป็น[[ไวยากรณ์การจัดรูปแบบขั้นสูง#ตาราง|ตาราง Markdown]]:
- สำหรับอาร์เรย์ของอ็อบเจกต์ จะใช้คีย์ของอ็อบเจกต์เป็นหัวตาราง
- สำหรับอาร์เรย์ของอาร์เรย์ จะสร้างตารางโดยมีแต่ละอาร์เรย์ย่อยเป็นแถว
- สำหรับอาร์เรย์ธรรมดา จะสร้างตารางคอลัมน์เดียวที่มี "Value" เป็นหัวตาราง
- สามารถระบุหัวคอลัมน์แบบกำหนดเองได้โดยใช้: `table:("Column 1", "Column 2", "Column 3")` เมื่อใช้กับอาร์เรย์ธรรมดา จะแบ่งข้อมูลเป็นแถวโดยอัตโนมัติตามจำนวนคอลัมน์ที่ระบุ
### `wikilink`
แปลงสตริง อาร์เรย์ หรืออ็อบเจกต์เป็นไวยากรณ์[[เชื่อมโยงโน้ต|ลิงก์วิกิ]]ของ Obsidian
- สำหรับสตริง: `"page"|wikilink` คืนค่า `[[page]]`
- สำหรับสตริงที่มีนามแฝง: `"page"|wikilink:"alias"` คืนค่า `[[page|alias]]`
- สำหรับอาร์เรย์: `["page1","page2"]|wikilink` คืนค่าอาร์เรย์ของลิงก์วิกิที่ไม่มีนามแฝง
- สำหรับอาร์เรย์ที่มีนามแฝง: `["page1","page2"]|wikilink:"alias"` คืนค่าอาร์เรย์ของลิงก์วิกิที่มีนามแฝงเดียวกันสำหรับลิงก์ทั้งหมด
- สำหรับอ็อบเจกต์: `{"page1": "alias1", "page2": "alias2"}|wikilink` คืนค่าลิงก์วิกิที่มีคีย์เป็นชื่อหน้าและค่าเป็นนามแฝง
## ตัวเลข
### `calc`
ทำการคำนวณเลขคณิตพื้นฐานกับตัวเลข
- รองรับตัวดำเนินการ: `+`, `-`, `*`, `/`, `**` (หรือ `^`) สำหรับการยกกำลัง
- ตัวอย่าง: `5|calc:"+10"` คืนค่า `15`
- ตัวอย่าง: `2|calc:"**3"` คืนค่า `8` (2 ยกกำลัง 3)
- คืนค่าสตริงเดิมหากอินพุตไม่ใช่ตัวเลข
### `length`
คืนค่าความยาวของสตริง อาร์เรย์ หรือจำนวนคีย์ในอ็อบเจกต์
- สำหรับสตริง: `"hello"|length` คืนค่า `5`
- สำหรับอาร์เรย์: `["a","b","c"]|length` คืนค่า `3`
- สำหรับอ็อบเจกต์: `{"a":1,"b":2}|length` คืนค่า `2`
### `round`
ปัดเศษตัวเลขเป็นจำนวนเต็มที่ใกล้เคียงที่สุดหรือจำนวนตำแหน่งทศนิยมที่ระบุ
- ไม่มีพารามิเตอร์: `3.7|round` คืนค่า `4`
- ระบุจำนวนตำแหน่งทศนิยม: `3.14159|round:2` คืนค่า `3.14`
## การประมวลผล HTML
ประมวลผลเนื้อหา HTML และแปลง HTML เป็น Markdown โปรดทราบว่า[[ตัวแปร|ตัวแปร]]อินพุตของคุณจะต้องมีเนื้อหา HTML เช่น การใช้ `{{fullHtml}}`, `{{contentHtml}}` หรือตัวแปร `{{selectorHtml:}}`
### `markdown`
แปลงสตริงเป็นสตริงที่จัดรูปแบบตาม [[Obsidian Flavored Markdown]]
- มีประโยชน์เมื่อใช้ร่วมกับตัวแปรที่คืนค่า HTML เช่น `{{contentHtml}}`, `{{fullHtml}}` และตัวแปร selector เช่น `{{selectorHtml:cssSelector}}`
### `remove_attr`
ลบเฉพาะแอตทริบิวต์ HTML ที่ระบุจากแท็ก
- ตัวอย่าง: `"<div class="test" id="example">Content</div>"|remove_attr:"class"` คืนค่า `<div id="example">Content</div>`
- หลายแอตทริบิวต์: `{{fullHtml|remove_attr:("class,style,id")}}`
### `remove_html`
ลบอิลิเมนต์ HTML ที่ระบุและเนื้อหาของมันจากสตริง
- รองรับชื่อแท็ก คลาส หรือ id เช่น `{{fullHtml|remove_html:("img,.class-name,#element-id")}}`
- หากต้องการลบเฉพาะแท็กหรือแอตทริบิวต์ HTML โดยไม่ลบเนื้อหา ให้ใช้ตัวกรอง `strip_tags` หรือ `strip_attr`
### `remove_tags`
ลบเฉพาะแท็ก HTML ที่ระบุ เก็บเนื้อหาของแท็กไว้
- ตัวอย่าง: `"<p>Hello <b>world</b>!</p>"|remove_tags:"b"` คืนค่า `"<p>Hello world!</p>"`
- หลายแท็ก: `{{fullHtml|remove_tags:("a,em,strong")}}`
### `replace_tags`
แทนที่แท็ก HTML โดยคงเนื้อหาและแอตทริบิวต์ของแท็กไว้
- `{{fullHtml|replace_tags:"strong":"h2"}}` แทนที่แท็ก `<strong>` ทั้งหมดด้วย `<h2>`
### `strip_attr`
ลบแอตทริบิวต์ HTML **ทั้งหมด**จากสตริง
- ใช้ `strip_attr:("class, id")` เพื่อเก็บแอตทริบิวต์ที่ระบุไว้
- ตัวอย่าง: `"<div class="test" id="example">Content</div>"|strip_attr:("class")` คืนค่า `<div id="example">Content</div>`
### `strip_md`
ลบการจัดรูปแบบ Markdown **ทั้งหมด**และคืนค่าสตริงข้อความธรรมดา เช่น เปลี่ยน `**text**` เป็น `text`
- เปลี่ยนข้อความที่จัดรูปแบบแล้วเป็นข้อความธรรมดาที่ไม่มีการจัดรูปแบบ รวมถึงตัวหนา ตัวเอียง ไฮไลต์ หัวเรื่อง โค้ด บล็อกคำคม ตาราง รายการงาน และลิงก์วิกิ
- ลบตาราง เชิงอรรถ รูปภาพ และอิลิเมนต์ HTML ออกทั้งหมด
### `strip_tags`
ลบแท็ก HTML **ทั้งหมด**จากสตริง เนื้อหาภายในแท็กจะถูกเก็บไว้
- ใช้ `strip_tags:("p,strong,em")` เพื่อเก็บแท็กที่ระบุไว้
- ตัวอย่าง: `"<p>Hello <b>world</b>!</p>"|strip_tags:("b")` คืนค่า `Hello <b>world</b>!`
## อาร์เรย์และอ็อบเจกต์
ประมวลผลอาร์เรย์และอ็อบเจกต์
### `first`
คืนค่าสมาชิกตัวแรกของอาร์เรย์เป็นสตริง
- `["a","b","c"]|first` คืนค่า `"a"`
- หากอินพุตไม่ใช่อาร์เรย์ จะคืนค่าอินพุตโดยไม่เปลี่ยนแปลง
### `join`
รวมสมาชิกของอาร์เรย์เป็นสตริง
- `["a","b","c"]|join` คืนค่า `"a,b,c"`
- สามารถระบุตัวคั่นแบบกำหนดเอง: `["a","b","c"]|join:" "` คืนค่า `"a b c"` ใช้ `join:"\n"` เพื่อคั่นสมาชิกด้วยการขึ้นบรรทัดใหม่
- มีประโยชน์เมื่อใช้หลัง `split` หรือ `slice`: `"a,b,c,d"|split:","|slice:1,3|join:" "` คืนค่า `"b c"`
### `last`
คืนค่าสมาชิกตัวสุดท้ายของอาร์เรย์เป็นสตริง
- `["a","b","c"]|last` คืนค่า `"c"`
- หากอินพุตไม่ใช่อาร์เรย์ จะคืนค่าอินพุตโดยไม่เปลี่ยนแปลง
### `map`
ใช้การแปลงกับแต่ละสมาชิกของอาร์เรย์โดยใช้ไวยากรณ์ `map:item => item.property` หรือ `map:item => item.nested.property` สำหรับคุณสมบัติที่ซ้อนกัน
- `[{gem: "obsidian", color: "black"}, {gem: "amethyst", color: "purple"}]|map:item => item.gem` คืนค่า `["obsidian", "amethyst"]`
- ใช้วงเล็บสำหรับ object literal และนิพจน์ที่ซับซ้อน: `map:item => ({key: value})` เช่น: `[{gem: "obsidian", color: "black"}, {gem: "amethyst", color: "purple"}]|map:item => ({name: item.gem, color: item.color})` คืนค่า `[{name: "obsidian", color: "black"}, {name: "amethyst", color: "purple"}]`
รองรับ string literal ด้วย เช่น `["rock", "pop"]|map:item => "genres/${item}"` คืนค่า `["genres/rock", "genres/pop"]`
ใช้ `map` ร่วมกับตัวกรอง `template` เช่น `map:item => ({name: ${item.gem}, color: item.color})|template:"- ${name} is ${color}\n"` สำหรับ string literal map ให้ใช้ `${str}` ในเทมเพลต เช่น `["rock", "pop"]|map:item => "genres/${item}"|template:"- ${str}"`
หมายเหตุ: ไม่สามารถใช้ตัวกรองในตัวภายใน `map` ได้ ซึ่งหมายความว่าตัวอย่างเช่น การตัดช่องว่างแต่ละค่าของอาร์เรย์ไม่สามารถทำด้วย `map` ได้
### `merge`
เพิ่มค่าใหม่ลงในอาร์เรย์
- สำหรับอาร์เรย์: `["a","b"]|merge:("c","d")` คืนค่า `["a","b","c","d"]`
- ค่าเดียว: `["a","b"]|merge:"c"` คืนค่า `["a","b","c"]`
- หากอินพุตไม่ใช่อาร์เรย์ จะสร้างอาร์เรย์ใหม่: `"a"|merge:("b","c")` คืนค่า `["a","b","c"]`
- สามารถใส่เครื่องหมายคำพูดให้ค่าได้: `["a"]|merge:('b,"c,d",e')` คืนค่า `["a","b","c,d","e"]`
### `nth`
เก็บสมาชิกที่ n ในอาร์เรย์โดยใช้ไวยากรณ์แบบ CSS nth-child และรูปแบบกลุ่ม ตำแหน่งทั้งหมดเริ่มจาก 1 (สมาชิกตัวแรกคือตำแหน่ง 1)
- `array|nth:3` เก็บเฉพาะสมาชิกตัวที่ 3
- `array|nth:3n` เก็บทุกสมาชิกตัวที่ 3 (3, 6, 9 เป็นต้น)
- `array|nth:n+3` เก็บสมาชิกตัวที่ 3 และตัวถัดไปทั้งหมด
ไวยากรณ์รูปแบบกลุ่มสำหรับโครงสร้างที่ซ้ำกัน:
- `array|nth:1,2,3:5` เก็บตำแหน่ง 1, 2, 3 จากแต่ละกลุ่ม 5 รายการ ตัวอย่าง: `[1,2,3,4,5,6,7,8,9,10]|nth:1,2,3:5` คืนค่า `[1,2,3,6,7,8]`
### `object`
จัดการข้อมูลอ็อบเจกต์:
- `object:array` แปลงอ็อบเจกต์เป็นอาร์เรย์ของคู่คีย์-ค่า
- `object:keys` คืนค่าอาร์เรย์ของคีย์ของอ็อบเจกต์
- `object:values` คืนค่าอาร์เรย์ของค่าของอ็อบเจกต์
- ตัวอย่าง: `{"a":1,"b":2}|object:array` คืนค่า `[["a",1],["b",2]]`
### `slice`
ดึงส่วนหนึ่งของสตริงหรืออาร์เรย์
- สำหรับสตริง: `"hello"|slice:1,4` คืนค่า `"ell"`
- สำหรับอาร์เรย์: `["a","b","c","d"]|slice:1,3` คืนค่า `["b","c"]`
- หากระบุพารามิเตอร์เดียว จะตัดจากดัชนีนั้นจนถึงท้าย: `"hello"|slice:2` คืนค่า `"llo"`
- ดัชนีลบนับจากท้าย: `"hello"|slice:-3` คืนค่า `"llo"`
- พารามิเตอร์ตัวที่สองเป็นแบบ exclusive: `"hello"|slice:1,4` รวมอักขระที่ดัชนี 1, 2 และ 3
- การใช้พารามิเตอร์ตัวที่สองเป็นลบจะไม่รวมสมาชิกจากท้าย: `"hello"|slice:0,-2` คืนค่า `"hel"`
### `split`
แบ่งสตริงเป็นอาร์เรย์ของสตริงย่อย
- `"a,b,c"|split:","` คืนค่า `["a","b","c"]`
- `"hello world"|split:" "` คืนค่า `["hello","world"]`
- หากไม่ระบุตัวคั่น จะแบ่งทุกอักขระ: `"hello"|split` คืนค่า `["h","e","l","l","o"]`
- สามารถใช้นิพจน์ทั่วไปเป็นตัวคั่น: `"a1b2c3"|split:[0-9]` คืนค่า `["a","b","c"]`
### `template`
ใช้สตริงเทมเพลตกับอ็อบเจกต์หรืออาร์เรย์ของอ็อบเจกต์ โดยใช้ไวยากรณ์ `object|template:"Template with ${variable}"`
- เข้าถึงคุณสมบัติที่ซ้อนกัน: `{"gem":{"name":"Obsidian"}}|template:"${gem.name}"` คืนค่า `"Obsidian"`
- สำหรับอ็อบเจกต์: `{"gem":"obsidian","hardness":5}|template:"${gem} has a hardness of ${hardness}"` คืนค่า `"obsidian has a hardness of 5"`
- สำหรับอาร์เรย์: `[{"gem":"obsidian","hardness":5},{"gem":"amethyst","hardness":7}]|template:"- ${gem} has a hardness of ${hardness}\n"` คืนค่ารายการที่จัดรูปแบบแล้ว
ทำงานร่วมกับ string literal จาก `map` โดยใช้ `${str}`:
- ตัวอย่าง: `["rock", "pop"]|map:item => "genres/${item}"|template:"- ${str}"` คืนค่ารายการที่จัดรูปแบบแล้ว
### `unique`
ลบค่าที่ซ้ำกันจากอาร์เรย์และอ็อบเจกต์
- สำหรับอาร์เรย์ของค่าพื้นฐาน: `[1,2,2,3,3]|unique` คืนค่า `[1,2,3]`
- สำหรับอาร์เรย์ของอ็อบเจกต์: `[{"a":1},{"b":2},{"a":1}]|unique` คืนค่า `[{"a":1},{"b":2}]`
- สำหรับอ็อบเจกต์ จะลบคุณสมบัติที่มีค่าซ้ำกัน โดยเก็บคีย์ของรายการที่เกิดขึ้นล่าสุด
- สำหรับสตริง จะคืนค่าอินพุตโดยไม่เปลี่ยนแปลง