2015-07-13 2 views
0

У меня есть массив хэшей, который выглядит следующим образом:Картирование массив хэшей к ключу хэша в Рубине

array= [ 
     { 
     "id"=> 101, 
     "first_name"=> "xxx", 
     "last_name"=> "G", 
     "email"=> "[email protected]", 
     "phone_number"=> "555-555-5555" 
     }, 
     { 
     "id"=> 102, 
     "first_name"=> "Jen", 
     "last_name"=> "P", 
     "email"=> "[email protected]", 
     "phone_number"=> "555-555-5555" 
     } 
    ] 

Я хочу, чтобы преобразовать его в хэш, который выглядит следующим образом:

array = { 
      "101"=> 
      { 
      "first_name"=> "xxx", 
      "last_name"=> "G", 
      "email"=> "[email protected]", 
      "phone_number"=> "555-555-5555" 
      }, 
      "102"=> 
      { 
      "first_name"=> "Jen", 
      "last_name"=> "P", 
      "email"=> "[email protected]", 
      "phone_number"=> "555-555-5555" 
      } 
     } 

Я попытался это, но он не работает:

array.each do |a| 
     a.map{|x| x[:id]} 
    end 

Как я могу сделать это в Ruby? Я смотрю на функцию карты, но не уверен, как ее реализовать в этом случае. Пожалуйста помоги!

+0

@ Зелёный смотрите мои правки – gazubi

+0

в любом случае, ваш массив хэшей имеют неправильный синтаксис, это не хэш рубин, это выглядит JavaScript 'json' –

+0

@ Зелёный Хорошо, спасибо за указание. Я использую json-библиотеку, чтобы преобразовать ее в хэш-код ruby. но мой вопрос по-прежнему остается – gazubi

ответ

3

Это работает (desctructive):

>> Hash[array.map { |x| [x.delete("id"), x] }] 
=>{ 
    101=>{ 
     "first_name"=>"xxx", 
     "last_name"=>"G", 
     "email"=>"[email protected]", 
     "phone_number"=>"555-555-5555" 
    }, 
    102=>{ 
     "first_name"=>"Jen", 
     "last_name"=>"P", 
     "email"=>"[email protected]", 
     "phone_number"=>"555-555-5555" 
    } 
} 
+4

Это действительно не возвращает то, что спросил ОП. Он возвращает еще один массив хэшей, и он просто переносит каждый оригинальный хеш в дополнительный хеш. Другие пользователи предоставили правильное решение. – tompave

+1

okey, после некоторого исследования я нашел именно то, что хотел OP –

+0

Так как Ruby 2.1 также можно использовать 'x.to_h' вместо' Hash [x] '. В основном эстетическая разница. –

2

Попробуйте это:

array_h = Hash.new 
array.each{|a| array_h[a["id"]] = a.reject{|e| e=='id' }} 

#Output of array_h: 
{ 
    101=> 
    { 
     "first_name"=>"xxx", 
     "last_name"=>"G", 
     "email"=>"[email protected]", 
     "phone_number"=>"555-555-5555" 
    }, 
    102=> 
    { 
     "first_name"=>"Jen", 
     "last_name"=>"P", 
     "email"=>"[email protected]", 
     "phone_number"=>"555-555-5555" 
    } 
} 

Примечание: Это не изменит исходный массив.

0

Неразрушающий вариант (сохраняет array) при удалении "id":

{}.tap { |h| array.each { |a| nh = a.dup; h[nh.delete('id')] = nh } } 
# => {101=>{"first_name"=>"xxx", "last_name"=>"G", "email"=>"[email protected]", "phone_number"=>"555-555-5555"}, 102=>{"first_name"=>"Jen", "last_name"=>"P", "email"=>"[email protected]", "phone_number"=>"555-555-5555"}} 
array 
# => [{"id"=>101, "first_name"=>"xxx", "last_name"=>"G", "email"=>"[email protected]", "phone_number"=>"555-555-5555"}, {"id"=>102, "first_name"=>"Jen", "last_name"=>"P", "email"=>"[email protected]", "phone_number"=>"555-555-5555"}] 
Смежные вопросы