2016-10-01 3 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,에 관한, 여기에 최선의 선택이 될 것으로 보인다.

관련 문제