당신은 돈 ' 각 세트의 사본 중 어느 것이 보관되는지는 신경 써야합니다. 블록이있는 Array#uniq
은이를 위해 특수 제작되었습니다. 가장 작은 색인을 유지합니다. 가장 큰 색인을 원하면 Array#reverse
을 uniq
전후에 적용하십시오.
, 그러나, 당신은 유지하는 하나 확인하려면 각 해시 다른 정보를 사용하고 싶다면, 당신이 할 수있는 그 블록 소요 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
을 유지하려면, 가정 해시 g
은 arr
이고, h
은 해시 f = { g[:a]=>g }
입니다. h
및 f
모두 키 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}]]
그런 다음 원하는대로 모든 네 개의 배열에서 하나의 해시를 선택하십시오.
안녕하세요. 매력처럼 멋진 작업입니다. 도움을 주셔서 감사합니다. @Vu Minh Tan – rick