Files
hugo/docs/content/en/functions/collections/Complement.md
2024-06-21 09:41:24 +02:00

2.1 KiB

title, description, categories, keywords, action, aliases
title description categories keywords action aliases
collections.Complement Returns the elements of the last collection that are not in any of the others.
aliases related returnType signatures
complement
functions/collections/Intersect
functions/collections/SymDiff
functions/collections/Union
any
collections.Complement COLLECTION [COLLECTION...]
/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