2019-10-21 04:22:28 -04:00
---
2023-10-20 03:42:39 -04:00
title: collections.Apply
linkTitle: 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]
2023-10-20 03:42:39 -04:00
keywords: []
2019-10-21 04:22:28 -04:00
menu:
docs:
2023-05-22 10:43:12 -04:00
parent: functions
2023-10-20 03:42:39 -04:00
function:
aliases: [apply]
returnType: any
signatures: ['collections.Apply COLLECTION FUNCTION [PARAM...]']
relatedFunctions:
- collections.Apply
- collections.Delimit
- collections.In
- collections.Reverse
- collections.Seq
- collections.Slice
aliases: [/functions/apply]
2019-10-21 04:22:28 -04:00
---
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.
2023-10-20 03:42:39 -04:00
2. The second argument is the name of the function as a string, which must be the name of a valid [template function].
2023-08-30 13:23:47 -04:00
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"
```
2023-10-20 03:42:39 -04: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 }}
```
2023-10-20 03:42:39 -04:00
However, it is not possible to provide the output of a range to the [`delimit`]function, so you need to `apply` it.
2019-10-21 04:22:28 -04:00
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 }}
```
2023-10-20 03:42:39 -04:00
Now in the completed version, you can sort the tags, convert the tags to links with `layouts/partials/post-tag-link.html` , [`chomp`] 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 %}}
2023-10-20 03:42:39 -04:00
[`chomp`]: /functions/strings/chomp/
[`delimit`]: /functions/collections/delimit/
[template function]: /functions/
[`range`]: /functions/go-template/range/