通过排序字段数组传递sort_by

the*_*ing 0 ruby proc

如果我有一系列哈希

collection = [
  { first_name: 'john', last_name: 'smith', middle: 'c'},
  { first_name: 'john', last_name: 'foo', middle: 'a'}
]
Run Code Online (Sandbox Code Playgroud)

还有一系列我想要排序的键:

sort_keys = ['first_name', 'last_name']
Run Code Online (Sandbox Code Playgroud)

sort_by如果密钥始终与集合中的密钥匹配,我如何传递这些密钥?

我试过了

collection.sort_by { |v| sort_keys.map(&:v) }
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我相信我需要使用proc,但我不确定如何实现它.非常感谢任何帮助!

使用Ruby 2.2.1

Ste*_*fan 5

如果您更改sort_keys包含符号:

sort_keys = [:first_name, :last_name]
Run Code Online (Sandbox Code Playgroud)

您可以使用它values_at来检索值:

collection.sort_by { |h| h.values_at(*sort_keys) }
#=> [{:first_name=>"john", :last_name=>"foo", :middle=>"a"}, {:first_name=>"john", :last_name=>"smith", :middle=>"c"}]
Run Code Online (Sandbox Code Playgroud)

用于对哈希进行排序的数组如下所示:

collection.map { |h| h.values_at(*sort_keys) }
#=> [["john", "smith"], ["john", "foo"]]
Run Code Online (Sandbox Code Playgroud)