2015-01-07 2 views
3

두 개의 해시 배열이 있습니다.해시의 두 배열을 비교하고 새 객체를 반환하십시오.

burgers = [ 
      {:id => 1, :name => "cheese burger"}, 
      {:id => 2, :name => "royale"}, 
      {:id => 3, :name => "big mac"}, 
      {:id => 4, :name => "angus beef"} 
      ] 

eaten = [ 
      {:burger_id => 1}, 
      {:burger_id => 2} 
      ] 

내가 burgers[:id]eaten[:burger_id] 동일하지 않는 배열이나 먹지 햄버거를 반환하고 싶습니다. burgers_not_eaten_method에는 예상되는 반환 값이 있습니다.

def burgers_not_eaten 
    #Not sure how to compare burger[:id] with eaten[:burger_id] 
    burgers.reject { |burger| burger[:id] == #eaten burger_id } 
    # Expected: [{:id => 3, :name => "big mac"},{:id => 4, :name => "angus beef"}] 
end 
+0

을 주의 : ID가 꼭 필요한 것이 아니라면, 4131 초 앞의'Set' – Dbz

답변

5

당신이 가까이있어, 쉽게 내가 배열로 모든 "먹는"ID를하다가 줄 수 있도록하고,과 같이, 해당 배열에 포함 확인 : 그냥 재미

BURGERS = [ 
      {:id => 1, :name => "cheese burger"}, 
      {:id => 2, :name => "royale"}, 
      {:id => 3, :name => "big mac"}, 
      {:id => 4, :name => "angus beef"} 
      ] 

EATEN = [ 
      {:burger_id => 1}, 
      {:burger_id => 2} 
     ] 

def burgers_not_eaten 
    eaten_ids = EATEN.map { |e| e[:burger_id] } 
    BURGERS.reject { |burger| eaten_ids.include?(burger[:id]) } 
end 

burgers_not_eaten 
# => [{:id=>3, :name=>"big mac"}, {:id=>4, :name=>"angus beef"}] 
+1

Ahah를 사용하는 것이 좋습니다. 답과 나의 유일한 차이점은'reject' /'select'의 사용법입니다! 당신은 크레딧을 얻었습니다;) – MrYoshiji

+1

하, 좋은 스택 오버 플로우 레이스 같은 건 없어요. :) –

+0

Alterntively,'eaten_ids = EATEN.flat_map {| 버거 | barger.values}'를 사용하여 'EATEN'의 해시에있는 키 이름이 변경된 경우 해당 행을 변경할 필요가 없습니다. –

관련 문제