How to sort a map by multiple params

Dear all,

I have a map of team members which I need to sort 1. alphabetical by family name and 2. by an integer assigned to each item. How can I do that when ranging over the map?

Many thanks!

Assuming a data structure similar to:

data/team.json
[
  {
    "last_name": "Smith",
    "first_name": "John",
    "some_value": 2
  },
  {
    "last_name": "Smith",
    "first_name": "Robert",
    "some_value": 5
  },
  {
    "last_name": "Smith",
    "first_name": "Marcia",
    "some_value": 1
  },
  {
    "last_name": "Jones",
    "first_name": "Kevin",
    "some_value": 7
  },
  {
    "last_name": "Jones",
    "first_name": "Timothy",
    "some_value": 6
  },
  {
    "last_name": "Jones",
    "first_name": "Patricia",
    "some_value": 42
  }
]

Build a unique, sorted slice of the last names, then range through the slice, using a where clause to get matching persons.

{{ $lastNames := slice }}
{{ range site.Data.team }}
  {{ $lastNames = $lastNames | append .last_name }}
{{ end }}
{{ $lastNames = $lastNames | uniq | sort }}

{{ range $lastNames }}
  {{ range sort (where site.Data.team "last_name" .) "some_value" }}
    <pre>
      First name: {{ .first_name }}
      Last name: {{ .last_name }}
      Some value: {{ .some_value }}
    </pre>
  {{ end }}
{{ end }}
2 Likes

Alternatively, you can group the members via scratch.

{{ $m := slice
  (dict "fn" "Fizz" "age" 30)
  (dict "fn" "Foo" "age" 20)
  (dict "fn" "Foo" "age" 17)
  (dict "fn" "Bar" "age" 11)
  (dict "fn" "Bar" "age" 22)
  (dict "fn" "Fizz" "age" 8)
}}
{{ $data := newScratch }}
{{/* sorting by age */}}
{{ range sort $m "age" }}
  {{/* group by fn */}}
  {{ $data.Add .fn (slice .) }}
{{ end }}
{{ range $data.Values }}
  {{ range . }}
    {{ warnf "fn: %s, age: %d" .fn .age }}
  {{ end }}
{{ end }}

Result:

WARN  fn: Bar, age: 11
WARN  fn: Bar, age: 22
WARN  fn: Fizz, age: 8
WARN  fn: Fizz, age: 30
WARN  fn: Foo, age: 17
WARN  fn: Foo, age: 20
2 Likes

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.