遍历yaml集合,按键排序

Loop through yaml collection, sort by key

erb 模板中,我想遍历这样的 yaml 集合:

collection:
  - title: "title a"
    year: 2017
  - title: "title b"
    year: 2017
  - title: "title b"
    year: 2016
  - ...

在输出文件(格式为降价)中,我想按年份对不同的条目进行排序并将它们拆分,而事先不知道年份中存在哪个 values-key:

# 2017
* title a  
* title b

# 2016 
* title c
…

这可以通过 Ruby 中的 each do 循环实现吗?


跟进

我有一个后续问题。下面给出的解决方案工作正常。现在,我希望能够在我的 ERB 模板中使用由此实现的 sort/group 功能。下面的代码输出所需的结果。但是我如何在 ERB 模板中调用这个 sort/group 函数,以便 "conferencecontribution" 集合中的条目相应地排序?

(附带说明一下,YAML 文件还包括其他需要排序的集合,因此将其作为一个函数可能有意义吗?)

dataset = YAML.load_file('cv.de.yaml')

dataset['conferencecontributions'].group_by { |hash| hash['year'] }
      .sort_by  { |year, _| -year }
      .each do |year, entries|
  puts "# #{year}"
  entries.each do |entry|
    puts "* #{entry["title"]} #{entry["location"]}"
  end
  puts
 end

您需要多个 group_bysort_by :

require 'yaml'

collection = YAML::load(%q{
collection:
  - title: "title a"
    year: 2017
  - title: "title b"
    year: 2017
  - title: "title c"
    year: 2016})["collection"]


collection.group_by { |hash| hash['year'] }
          .sort_by  { |year, _| -year }
          .each do |year, entries|
  puts "# #{year}"
  entries.map { |entry| entry['title'] }.sort.each do |title|
    puts "* #{title}"
  end
  puts
end

它输出:

# 2017
* title a
* title b

# 2016
* title c

回答您的 follow-up 问题(也许应该作为一个单独的问题发布):是的,您应该为此定义一个方法,如下所示:

def by_year(data, &block)
  years = data.group_by {|hash| hash['year'] }
      .sort_by  {|year,| -year }
  block ? years.each(&block) : years
end

然后你会像这样在你的 ERB 中使用它:

<% by_year(dataset['conferencecontributions']) do |year, entries| %>
  <h1><%= year %></h1>
  <ul>
  <% entries.each do |entry| %>
    <li><%= entry["title"] %>, <%= entry["location"] %></li>
  <% end %>
  </ul>
<% end %>

在 repl.it 上查看:https://repl.it/F3Vl