我有一个哈希数组,我想根据键的值按字母顺序对哈希值进行排序:name
names_array = [{:name=>"item3",:ID=>"345"},{:name=>"item1",:ID=>"127"},{:name=>"item2",:ID=>"298"}]
输出应如下所示:
names_array = [{:name=>"item1",:ID=>"127"},{:name=>"item2",:ID=>"298"},{:name=>"item3",:ID=>"345"}]
有什么办法吗?
答案 0 :(得分:2)
names_array.sort_by { |hash| hash[:name] }
#=> [{:name=>"item1", :ID=>"127"}, {:name=>"item2", :ID=>"298"}, {:name=>"item3", :ID=>"345"}]
答案 1 :(得分:0)
sort_by
是在这里使用的自然方法,但我很好奇它如何与对键:name
的值进行排序然后使用values_at
提取的方法进行比较以正确的顺序散列(这要求首先将数组转换为散列)。
def sort_by_method(names_array)
names_array.sort_by { |hash| hash[:name] }
end
def values_at_method(names_array)
h = names_array.each_with_object({}) { |g,h| h[g[:name]] = g }
h.values_at *h.keys.sort
end
require 'fruity'
ALPHA = ('a'..'z').to_a
def bench_em(size, name_size)
names_array = size.times.map { { a: 1, name: ALPHA.sample(name_size).join, c: 2 } }
compare do
_sort_by { sort_by_method names_array }
_values_at { values_at_method names_array }
end
end
bench_em(100, 10)
Running each test 64 times. Test will take about 1 second.
_sort_by is similar to _values_at
bench_em(1_000, 10)
Running each test 4 times. Test will take about 1 second.
_values_at is similar to _sort_by
bench_em(10_000, 10)
Running each test once. Test will take about 1 second.
_sort_by is similar to _values_at
bench_em(100_000, 10)
Running each test once. Test will take about 8 seconds.
_sort_by is similar to _values_at
看起来性能大致相同,因此sort_by
更简单,读起来更好,似乎是最佳选择。