Hash each where

Hi,

this is actually a Ruby question, but I hope I get an answer anyway.

I am looking for a "hash.each.where" function, but I can't find anything.

I have a hash that has a :status key. The value could be 'new' or 'old'.

Now I want to get only the entries where status is 'new'. I know how to do this with an if-clause, but there has to be a better way.

What I want is something like this:

puts "New entries" hash.each where :status => 'new' do |new|   puts new end

puts "Old entries" hash.each where :status => 'old' do |old|   puts old end

I thought maybe the hash.select function could help me, but I only found that example and I don't know how to unse the constraints only for the :status key and not all keys:

   h = { "a" => 100, "b" => 200, "c" => 300 }    h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}    h.select {|k,v| v < 200} #=> {"a" => 100}

Thanks in advance Sebastian

Do you mean you have an array of hashes? Or a hash where each value is an object/array? Can you give an illustration of what your hash looks like, so it's possible to suggest some solutions.

Cheers,

Sorry,

yes I have an array of hashes:

hash = [{:name => "like", :status => "old"}, {:name => "this", :status => "new"}, {:name => "here", :status => "old"}]

only_new_entries = array_of_hashes.select { |h| h[:status] == "new" }

~ jf

John’s answer. Also, the Ruby Hash API.

Thank you,

that was exactly what I was looking for!!!

Sebastian <sebastian.goldt@...> writes:

Thank you,

that was exactly what I was looking for!!!

Further to the solution provided, if the data is coming from a database, then you can create some scopes to filter the information for you. It might be faster than looping through the array.