Mapping to the Keys of a Hash

32,092

Solution 1

Why don't you just do this?

my_hash.map{|k,v| {k.gsub(" 00:00:00+00","") => v}}.reduce(:merge)

This gives you

{"2011-02-01"=>816, "2011-01-01"=>58, "2011-03-01"=>241}

Solution 2

There is a new "Rails way" methods for this task :)

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys

Solution 3

Using iblue answer, you could use a regexp to handle this situation, for example:

pattern = /00:00:00(\+00)+/
my_hash.map{|k,v| {k.gsub(pattern,"") => v}}.reduce(:merge)

You could improve the pattern to handle different situations.

Hope it helps.

Edit:

Sorry, iblue have already posted the answer

Solution 4

Another alternative could be:

  1. map
  2. return converted two elements array [converted_key, converted_value]
  3. convert back to a hash
irb(main):001:0> {a: 1, b: 2}.map{|k,v| [k.to_s, v.to_s]}.to_h               
=> {"a"=>"1", "b"=>"2"}   
Share:
32,092
Myxtic
Author by

Myxtic

StackOverflow encountered an error loading About Me for this person. Please come back later. Thank you.

Updated on August 11, 2021

Comments

  • Myxtic
    Myxtic almost 3 years

    I am working with a hash called my_hash :

    {"2011-02-01 00:00:00+00"=>816, "2011-01-01 00:00:00+00"=>58, "2011-03-01 00:00:00+00"=>241}
    

    First, I try to parse all the keys, in my_hash (which are times).

    my_hash.keys.sort.each do |key|
      parsed_keys << Date.parse(key).to_s
    end 
    

    Which gives me this :

    ["2011-01-01", "2011-02-01", "2011-03-01"]
    

    Then, I try to map parsed_keys back to the keys of my_hash :

    Hash[my_hash.map {|k,v| [parsed_keys[k], v]}]
    

    But that returns the following error :

    TypeError: can't convert String into Integer
    

    How can I map parsed_keys back to the keys of my_hash ?

    My aim is to get rid of the "00:00:00+00" at end of all the keys.