Is there a way to sort lists in Jekyll by two fields?

Viewed 2559

Is there a way to sort lists by two fields with Jekyll/Liquid? For example, sorting first by year and then title. I have tried:

{% assign list = site.data.papers.papers | sort: 'year' | sort: 'title' %}

but that left it sorted only based on the last field, in this case the title. There was some discussion on this, but it seems to have been frozen without being merged: https://github.com/jekyll/jekyll/issues/1802

Thanks!

2 Answers

If you start with a single array of hashes and you want to end up with the same array in the same structure (i.e. not grouped, just multi-sorted), use:

{% assign grouped = array | group_by: 'field1' %}
{% for item in grouped %}
   {% assign sorted = item['items'] | sort: 'field2' %}
   {% if forloop.first %}
      {% assign array = sorted %}
   {% else %}
      {% assign array = array | concat: sorted %}
   {% endif %}
{% endfor %}
Related