lolix
lolix

Reputation: 1527

transform array of arrays in array of hash

array = [
    [ 1, "name1" ],
    [ 2, "name2" ],
    [ 3, "name3" ],
    [ 4, "name4" ]
]

I want to make this as an array of hashes like this:

array_hash = [{ "id" => 1, "name" => "name1" },  
              { "id" => 2, "name" => "name2" },  
              { "id" => 3, "name" => "name3" },  
              { "id" => 4, "name" => "name4" }]

Upvotes: 2

Views: 1058

Answers (3)

Stefan
Stefan

Reputation: 114138

I'd use:

array.map { |id, name| { 'id' => id, 'name' => name } }
#=> [{"id"=>1, "name"=>"name1"},
#    {"id"=>2, "name"=>"name2"},
#    {"id"=>3, "name"=>"name3"},
#    {"id"=>4, "name"=>"name4"}]

Upvotes: 4

Tom L
Tom L

Reputation: 3409

The .to_h method is new to Ruby 2.x. Here is an alternative for anyone on 1.9.x or lower.

array = [[ 1, "name1" ], [ 2, "name2" ], [ 3, "name3" ], [ 4, "name4" ]]

array.inject([]) { |a, r| a << { id: r[0], name: r[1] } }

Upvotes: 0

Aleksei Matiushkin
Aleksei Matiushkin

Reputation: 121000

array = [
    [ 1, "name1" ],
    [ 2, "name2" ],
    [ 3, "name3" ],
    [ 4, "name4" ]
]
array.map { |e| ['id', 'name'].zip(e).to_h }
#⇒ [
#    {"id"=>1, "name"=>"name1"},
#    {"id"=>2, "name"=>"name2"},
#    {"id"=>3, "name"=>"name3"},
#    {"id"=>4, "name"=>"name4"}
# ]

The only interesting here is Enumerable#zip, that “merges” arrays.

Upvotes: 6

Related Questions