2...">

Compare two arrays of hashes and return a new object

I have two arrays of hashes.

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

      

I would like to return an array or uneaten burgers where burgers[:id]

does not equal eaten[:burger_id]

. In burgers_not_eaten_method

I have an expected return value.

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

      

+3


source to share


1 answer


You are close, to make it easy, I would hook all the "eaten" identifiers into an array and check the inclusion in this array, for example:



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

      

+5


source







All Articles