Search code examples
rubyhashhash-of-hashes

Create hash-of-hashes using structure of the default hash


I have the following code:

default = {:id => 0, :detail =>{:name=>"Default", :id => ""}}
employees = {}

nr = (0..3).to_a 
nr.each do |n|
    employee = default
    employee[:id] = n
    employee[:detail][:name] = "Default #{n}"
    employee[:detail][:id] = "KEY-#{n}"
    employees[n] = employee
end
puts employees

I expect the values for the key :id in :detail hash to be KEY-0, KEY-1, KEY-2.


Solution

  • You will need marshall your default in order to copy

    default = {id: 0, detail: {name: "Default", id:""}}
    employees = {}
    4.times do |n|
      employees[n] = Marshal.load(Marshal.dump(default))
      employees[n][:id] = n
      employees[n][:detail][:name] = "Default #{n}"
      employees[n][:detail][:id] = "KEY-#{n}"
    end
    puts employees
    

    The output is

    {0=>{:id=>0, :detail=>{:name=>"Default 0", :id=>"KEY-0"}}, 1=>{:id=>1, :detail=>{:name=>"Default 1", :id=>"KEY-1"}}, 2=>{:id=>2, :detail=>{:name=>"Default 2", :id=>"KEY-2"}}, 3=>{:id=>3, :detail=>{:name=>"Default 3", :id=>"KEY-3"}}}
    

    You can read this post Cloning an array with its content

    ADDED

    And here you have an reduce version and should be faster if you want.

    employees = {}
    4.times { |n| employees[n]={id: n, detail: {name: "Default #{n}", id:"KEY-#{n}"}} }
    puts employees