-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improves #2196
- Loading branch information
Showing
1 changed file
with
21 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,95 +1,51 @@ | ||
--- | ||
title: collections.Index | ||
description: Looks up the index(es) or key(s) of the data structure passed into it. | ||
description: Returns the object, element, or value associated with the given key or keys. | ||
categories: [] | ||
keywords: [] | ||
action: | ||
aliases: [index] | ||
related: [] | ||
returnType: any | ||
signatures: | ||
- collections.Index COLLECTION INDEXES | ||
- collections.Index COLLECTION KEYS | ||
- collections.Index COLLECTION KEY... | ||
aliases: [/functions/index,/functions/index-function] | ||
--- | ||
|
||
The `index` functions returns the result of indexing its first argument by the following arguments. Each indexed item must be a map or a slice, e.g.: | ||
Each indexed item must be a map or a slice: | ||
|
||
```go-html-template | ||
{{ $slice := slice "a" "b" "c" }} | ||
{{ index $slice 0 }} → a | ||
{{ index $slice 1 }} → b | ||
{{ $s := slice "a" "b" "c" }} | ||
{{ index $s 0 }} → a | ||
{{ index $s 1 }} → b | ||
{{ $map := dict "a" 100 "b" 200 }} | ||
{{ index $map "b" }} → 200 | ||
{{ $m := dict "a" 100 "b" 200 }} | ||
{{ index $m "b" }} → 200 | ||
``` | ||
|
||
The function takes multiple indices as arguments, and this can be used to get nested values, e.g.: | ||
Use two or more keys to access a nested value: | ||
|
||
```go-html-template | ||
{{ $map := dict "a" 100 "b" 200 "c" (slice 10 20 30) }} | ||
{{ index $map "c" 1 }} → 20 | ||
{{ $map := dict "a" 100 "b" 200 "c" (dict "d" 10 "e" 20) }} | ||
{{ index $map "c" "e" }} → 20 | ||
``` | ||
|
||
You may write multiple indices as a slice: | ||
|
||
```go-html-template | ||
{{ $map := dict "a" 100 "b" 200 "c" (dict "d" 10 "e" 20) }} | ||
{{ $slice := slice "c" "e" }} | ||
{{ index $map $slice }} → 20 | ||
``` | ||
|
||
## Example: load data from a path based on front matter parameters | ||
{{ $m := dict "a" 100 "b" 200 "c" (slice 10 20 30) }} | ||
{{ index $m "c" 1 }} → 20 | ||
Assume you want to add a `location = ""` field to your front matter for every article written in `content/vacations/`. You want to use this field to populate information about the location at the bottom of the article in your `single.html` template. You also have a directory in `data/locations/` that looks like the following: | ||
|
||
```text | ||
data/ | ||
└── locations/ | ||
├── abilene.toml | ||
├── chicago.toml | ||
├── oslo.toml | ||
└── provo.toml | ||
{{ $m := dict "a" 100 "b" 200 "c" (dict "d" 10 "e" 20) }} | ||
{{ index $m "c" "e" }} → 20 | ||
``` | ||
|
||
Here is an example: | ||
|
||
{{< code-toggle file=data/locations/oslo >}} | ||
website = "https://www.oslo.kommune.no" | ||
pop_city = 658390 | ||
pop_metro = 1717900 | ||
{{< /code-toggle >}} | ||
|
||
The example we will use will be an article on Oslo, whose front matter should be set to exactly the same name as the corresponding file name in `data/locations/`: | ||
|
||
{{< code-toggle file=content/articles/oslo.md fm=true >}} | ||
title = "My Norwegian Vacation" | ||
location = "oslo" | ||
{{< /code-toggle >}} | ||
|
||
The content of `oslo.toml` can be accessed from your template using the following node path: `.Site.Data.locations.oslo`. However, the specific file you need is going to change according to the front matter. | ||
|
||
This is where the `index` function is needed. `index` takes 2 arguments in this use case: | ||
|
||
1. The node path | ||
2. A string corresponding to the desired data; e.g.— | ||
You may also use a slice of keys to access a nested value: | ||
|
||
```go-html-template | ||
{{ index .Site.Data.locations "oslo" }} | ||
{{ $m := dict "a" 100 "b" 200 "c" (dict "d" 10 "e" 20) }} | ||
{{ $s := slice "c" "e" }} | ||
{{ index $m $s }} → 20 | ||
``` | ||
|
||
The variable for `.Params.location` is a string and can therefore replace `oslo` in the example above: | ||
Use the `collections.Index` function to access a nested value when the key is variable. For example, these are equivalent: | ||
|
||
```go-html-template | ||
{{ index .Site.Data.locations .Params.location }} | ||
=> map[website:https://www.oslo.kommune.no pop_city:658390 pop_metro:1717900] | ||
``` | ||
{{ .Site.Params.foo }} | ||
Now the call will return the specific file according to the location specified in the content's front matter, but you will likely want to write specific properties to the template. You can do this by continuing down the node path via dot notation (`.`): | ||
|
||
```go-html-template | ||
{{ (index .Site.Data.locations .Params.location).pop_city }} | ||
=> 658390 | ||
{{ $k := "foo" }} | ||
{{ index .Site.Params $k }} | ||
``` |