hugo/docs/content/en/functions/collections/Complement.md
2023-10-20 09:43:56 +02:00

2.2 KiB

title linkTitle description categories keywords menu function relatedFunctions aliases
collections.Complement complement Returns the elements of the last collection that are not in any of the others.
functions
docs
parent
functions
aliases returnType signatures
complement
any
collections.Complement COLLECTION [COLLECTION]...
collections.Complement
collections.Intersect
collections.SymDiff
collections.Union
/functions/complement

To find the elements within $c3 that do not exist in $c1 or $c2:

{{ $c1 := slice 3 }}
{{ $c2 := slice 4 5 }}
{{ $c3 := slice 1 2 3 4 5 }}

{{ complement $c1 $c2 $c3 }} → [1 2]

{{% note %}} Make your code simpler to understand by using a chained pipeline:

{{% /note %}}

{{ $c3 | complement $c1 $c2 }} → [1 2]

You can also use the complement function with page collections. Let's say your site has five content types:

content/
├── blog/
├── books/
├── faqs/
├── films/
└── songs/

To list everything except blog articles (blog) and frequently asked questions (faqs):

{{ $blog := where site.RegularPages "Type" "blog" }}
{{ $faqs := where site.RegularPages "Type" "faqs" }}
{{ range site.RegularPages | complement $blog $faqs }}
  <a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ end }}

{{% note %}} Although the example above demonstrates the complement function, you could use the where function as well:

{{% /note %}}

{{ range where site.RegularPages "Type" "not in" (slice "blog" "faqs") }}
  <a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ end }}

In this example we use the complement function to remove stop words from a sentence:

{{ $text := "The quick brown fox jumps over the lazy dog" }}
{{ $stopWords := slice "a" "an" "in" "over" "the" "under" }}
{{ $filtered := split $text " " | complement $stopWords }}

{{ delimit $filtered " " }} → The quick brown fox jumps lazy dog