2016-10-01 14 views
0

に、アレイ内のハッシュ:ルビーは、並べ替え、私はハッシュの配列を持っていると私は、キーの値に基づいて、アルファベット順にハッシュをソートしたいアルファベット順

:出力のようになります

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"}] 

これにはどのような方法がありますか?

答えて

2
names_array.sort_by { |hash| hash[:name] } 
#=> [{:name=>"item1", :ID=>"127"}, {:name=>"item2", :ID=>"298"}, {:name=>"item3", :ID=>"345"}] 

Enumerable#sort_by

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が、ここでは最良の選択であるように思われます。

関連する問題