遍历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_by
和 sort_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
在 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_by
和 sort_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