2019-10-21 04:22:28 -04:00
---
title: apply
2023-07-29 05:15:54 -04:00
description: Given an array or slice, `apply` returns a new slice with a function applied over it.
2019-10-21 04:22:28 -04:00
categories: [functions]
menu:
docs:
2023-05-22 10:43:12 -04:00
parent: functions
2019-10-21 04:22:28 -04:00
keywords: [advanced]
signature: ["apply COLLECTION FUNCTION [PARAM...]"]
relatedfuncs: []
---
2023-08-30 13:23:47 -04:00
`apply` expects at least three arguments, depending on the function being applied.
2019-10-21 04:22:28 -04:00
2023-08-30 13:23:47 -04:00
1. The first argument is the sequence to operate on.
2. The second argument is the name of the function as a string, which must be the name of a valid [Hugo function][functions].
3. After that, the arguments to the applied function are provided, with the string `"."` standing in for each element of the sequence the function is to be applied against.
2019-10-21 04:22:28 -04:00
Here is an example of a content file with `names:` as a front matter field:
2023-05-22 10:43:12 -04:00
{{< code-toggle file = "content/example.md" fm = true copy = false > }}
title: Example
2019-10-21 04:22:28 -04:00
names: [ "Derek Perkins", "Joe Bergevin", "Tanner Linsley" ]
2023-05-22 10:43:12 -04:00
{{< / code-toggle > }}
2019-10-21 04:22:28 -04:00
You can then use `apply` as follows:
2023-05-22 10:43:12 -04:00
```go-html-template
2019-10-21 04:22:28 -04:00
{{ apply .Params.names "urlize" "." }}
```
Which will result in the following:
```
"derek-perkins", "joe-bergevin", "tanner-linsley"
```
2022-12-20 05:04:41 -05:00
This is *roughly* equivalent to using the following with [range]:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
```go-html-template
2019-10-21 04:22:28 -04:00
{{ range .Params.names }}{{ . | urlize }}{{ end }}
```
However, it is not possible to provide the output of a range to the [`delimit` function][delimit], so you need to `apply` it.
2022-12-20 05:04:41 -05:00
If you have `post-tag-list.html` and `post-tag-link.html` as [partials], you *could* use the following snippets, respectively:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code file = "layouts/partials/post-tag-list.html" copy = false > }}
2019-10-21 04:22:28 -04:00
{{ with .Params.tags }}
2023-05-22 10:43:12 -04:00
< div class = "tags-list" >
Tags:
{{ $len := len . }}
{{ if eq $len 1 }}
{{ partial "post-tag-link.html" (index . 0) }}
{{ else }}
{{ $last := sub $len 1 }}
{{ range first $last . }}
{{ partial "post-tag-link.html" . }},
{{ end }}
{{ partial "post-tag-link.html" (index . $last) }}
2019-10-21 04:22:28 -04:00
{{ end }}
2023-05-22 10:43:12 -04:00
< / div >
2019-10-21 04:22:28 -04:00
{{ end }}
{{< / code > }}
2023-05-22 10:43:12 -04:00
{{< code file = "layouts/partials/post-tag-link.html" copy = false > }}
2019-10-21 04:22:28 -04:00
< a class = "post-tag post-tag-{{ . | urlize }}" href = "/tags/{{ . | urlize }}" > {{ . }}< / a >
{{< / code > }}
This works, but the complexity of `post-tag-list.html` is fairly high. The Hugo template needs to perform special behavior for the case where there’ s only one tag, and it has to treat the last tag as special. Additionally, the tag list will be rendered something like `Tags: tag1 , tag2 , tag3` because of the way that the HTML is generated and then interpreted by a browser.
This first version of `layouts/partials/post-tag-list.html` separates all of the operations for ease of reading. The combined and DRYer version is shown next:
2023-05-22 10:43:12 -04:00
```go-html-template
2019-10-21 04:22:28 -04:00
{{ with .Params.tags }}
2023-05-22 10:43:12 -04:00
< div class = "tags-list" >
Tags:
{{ $sort := sort . }}
{{ $links := apply $sort "partial" "post-tag-link.html" "." }}
{{ $clean := apply $links "chomp" "." }}
{{ delimit $clean ", " }}
< / div >
2019-10-21 04:22:28 -04:00
{{ end }}
```
2022-12-20 05:04:41 -05:00
Now in the completed version, you can sort the tags, convert the tags to links with `layouts/partials/post-tag-link.html` , [chomp] off stray newlines, and join the tags together in a delimited list for presentation. Here is an even DRYer version of the preceding example:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code file = "layouts/partials/post-tag-list.html" > }}
{{ with .Params.tags }}
< div class = "tags-list" >
Tags:
{{ delimit (apply (apply (sort .) "partial" "post-tag-link.html" ".") "chomp" ".") ", " }}
< / div >
{{ end }}
2019-10-21 04:22:28 -04:00
{{< / code > }}
{{% note %}}
`apply` does not work when receiving the sequence as an argument through a pipeline.
{{% /note %}}
[chomp]: /functions/chomp/ "See documentation for the chomp function"
[delimit]: /functions/delimit/ "See documentation for the delimit function"
[functions]: /functions/ "See the full list of Hugo functions to see what can be passed as an argument to the apply function."
[partials]: /templates/partials/
[range]: /functions/range/ "Learn the importance of the range function, a fundamental keyword in both Hugo templates and the Go programming language."