해시

2014-11-17 3 views
3

의 배열에서 문자열의 기초에 고유 한 요소를 가져옵니다 내가 해시의 배열을 가지고 :해시

[{:a => "63-aaa",:b =>1}, {:a => "90-bbb",:b => 89}, {:a => "63-aaa", :b => 1},{:a => "45-hhh", :b => 44}, {:a => "32-kkk", :b => 67}, {: => "90-bbb", :b => 89}] 

a 키 값 63-aaa, 90-bbb, 45-hhh32-kkk 있습니다. 당신이 경우 Array#uniq에 블록을 전달할 수 있습니다

[{:a => "63-aaa",:b =>1}, {:a => "90-bbb",:b => 89}, {:a => "45-hhh", :b => 44}, {:a => "32-kkk", :b => 67}] 

답변

8

: 내가 좋아하는 a의 값의 ID에 기초하여 배열의 고유 한 요소를 얻으려면

arr.uniq { |hash| hash[:a] } 
+0

안녕하세요. 매력처럼 멋진 작업입니다. 도움을 주셔서 감사합니다. @Vu Minh Tan – rick

2

당신은 돈 ' 각 세트의 사본 중 어느 것이 보관되는지는 신경 써야합니다. 블록이있는 Array#uniq은이를 위해 특수 제작되었습니다. 가장 작은 색인을 유지합니다. 가장 큰 색인을 원하면 Array#reverseuniq 전후에 적용하십시오.

, 그러나, 당신은 유지하는 하나 확인하려면 각 해시 다른 정보를 사용하고 싶다면, 당신이 할 수있는 그 블록 소요 Hash#update (일명 merge!)의 양식을 사용하여 :

arr = [{:a=>"63-aaa", :b=> 1}, {:a=>"90-bbb", :b=>89}, {:a=>"63-aaa", :b=>22}, 
     {:a=>"45-hhh", :b=>44}, {:a=>"32-kkk", :b=>67}, {:a=>"90-bbb", :b=>14}] 

arr.each_with_object({}) do |g,h| 
    h.update({ g[:a]=>g }) { |k,oh,nh| <code to return oh or nh> } 
end.values 

을 전자에 대해 나는 빈 해시 (블록 변수 h를) 만들었습니다

arr.each_with_object({}) do |g,h| 
    h.update({ g[:a]=>g }) { |k,oh,nh| nh[:b] > oh[:b] ? nh : oh } 
end.values 
    #=> [{:a=>"63-aaa", :b=>22}, {:a=>"90-bbb", :b=>89}, 
    # {:a=>"45-hhh", :b=>44}, {:a=>"32-kkk", :b=>67}] 

하고, 예를 들어, 당신은 h[:b]이 가장 큰하는 해시 h을 유지하려면, 가정 해시 garr이고, h은 해시 f = { g[:a]=>g }입니다. hf 모두 키 g[:a],

{ |k,oh,nh| (nh[:b] > oh[:b]) ? nh : oh } 

h의 키 g[:a] 값을 확인하도록 요청되는 블록이있는 경우 (즉, 계속 두 해시있는 것이다). 블록 변수는 다음과 같습니다

k = g[:a] 
oh = h[g[:a]] 
nh = g 

이 ( k이 블록에서 사용되지 않습니다, 그래서 우리는 |_,oh,nh|으로 블록 변수를 작성할 수 있습니다.)

each_with_object 반환

h = {"63-aaa"=>{:a=>"63-aaa", :b=>22}, "90-bbb"=>{:a=>"90-bbb", :b=>89}, 
    "45-hhh"=>{:a=>"45-hhh", :b=>44}, "32-kkk"=>{:a=>"32-kkk", :b=>67}} 

그래서 우리는 단지를 값을 추출해야합니다 :

h.values 
    #=> [{:a=>"63-aaa", :b=>22}, {:a=>"90-bbb", :b=>89}, 
    # {:a=>"45-hhh", :b=>44}, {:a=>"32-kkk", :b=>67}] 

또 다른 방법은 먼저 다음을 실행하는 것입니다.

arr.group_by { |h| h[:a] }.values 
    #=> [[{:a=>"63-aaa", :b=> 1}, {:a=>"63-aaa", :b=>22}], 
    # [{:a=>"90-bbb", :b=>89}, {:a=>"90-bbb", :b=>14}], 
    # [{:a=>"45-hhh", :b=>44}], 
    # [{:a=>"32-kkk", :b=>67}]] 

그런 다음 원하는대로 모든 네 개의 배열에서 하나의 해시를 선택하십시오.

+0

나는 또한 이것을 시도했습니다. 네가 맞습니다. 이것에 대해 더 많은 지식을 주셔서 감사합니다. @Cary Swoveland에게 감사합니다. – rick