2019-10-21 10:22:28 +02:00
---
title: apply
2023-07-29 11:15:54 +02:00
description: Given an array or slice, `apply` returns a new slice with a function applied over it.
2019-10-21 10:22:28 +02:00
categories: [functions]
menu:
docs:
2023-05-22 16:43:12 +02:00
parent: functions
2019-10-21 10:22:28 +02:00
keywords: [advanced]
signature: ["apply COLLECTION FUNCTION [PARAM...]"]
relatedfuncs: []
---
2023-08-30 19:23:47 +02:00
`apply` expects at least three arguments, depending on the function being applied.
2019-10-21 10:22:28 +02:00
2023-08-30 19:23:47 +02: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 10:22:28 +02:00
Here is an example of a content file with `names:` as a front matter field:
2023-05-22 16:43:12 +02:00
{{< code-toggle file="content/example.md" fm=true copy=false >}}
title: Example
2019-10-21 10:22:28 +02:00
names: [ "Derek Perkins", "Joe Bergevin", "Tanner Linsley" ]
2023-05-22 16:43:12 +02:00
{{< /code-toggle >}}
2019-10-21 10:22:28 +02:00
You can then use `apply` as follows:
2023-05-22 16:43:12 +02:00
```go-html-template
2019-10-21 10:22:28 +02:00
{{ apply .Params.names "urlize" "." }}
```
Which will result in the following:
```
"derek-perkins", "joe-bergevin", "tanner-linsley"
```
2022-12-20 11:04:41 +01:00
This is * roughly * equivalent to using the following with [range]:
2019-10-21 10:22:28 +02:00
2023-05-22 16:43:12 +02:00
```go-html-template
2019-10-21 10:22:28 +02: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 11:04:41 +01: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 10:22:28 +02:00
2023-05-22 16:43:12 +02:00
{{< code file="layouts/partials/post-tag-list.html" copy=false >}}
2019-10-21 10:22:28 +02:00
{{ with .Params.tags }}
2023-05-22 16:43:12 +02: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 10:22:28 +02:00
{{ end }}
2023-05-22 16:43:12 +02:00
</div>
2019-10-21 10:22:28 +02:00
{{ end }}
{{< /code >}}
2023-05-22 16:43:12 +02:00
{{< code file="layouts/partials/post-tag-link.html" copy=false >}}
2019-10-21 10:22:28 +02: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 16:43:12 +02:00
```go-html-template
2019-10-21 10:22:28 +02:00
{{ with .Params.tags }}
2023-05-22 16:43:12 +02: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 10:22:28 +02:00
{{ end }}
```
2022-12-20 11:04:41 +01: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 10:22:28 +02:00
2023-05-22 16:43:12 +02: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 10:22:28 +02: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."