2016-04-13 2 views
0

Если у меня есть следующий массив:Превратить массив в хэш с ключами соответствующих значений

foo = ['a', 'b', 'c', 'd', 'e'] 

есть простой способ в Ruby, чтобы сделать это в хэш, который выглядит как:

{ 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e' } 

я могу это сделать:

Hash[foo.map{|a| [a, a]}] 

, который работает просто отлично, но мне интересно, если есть какой-то другой способ.

+0

Там другие пути тоже, но этот путь вполне приемлем, и он краток и будет использоваться наиболее часто. –

ответ

3

Вам нужен хэш с только эти значения, или будет ли хэш с самоценкой в ​​порядке?

Например:

Hash.new { |h,k| h[k] = k } 

Вы также можете сделать это и объединить его с собой на пары:

Hash[foo.zip(foo)] 
+0

Oooh! Мне нравится zip()! Это какая-то магия Руби, о которой мне было интересно. :-) –

+1

@ Dan, это будет незадолго до того, как вы увидите 'zip' как довольно пешехода. –

+1

Как только у вас есть 'h = Hash.new {| h, k | h [k] = k} => {} 'вы можете написать' h.values_at (* foo) # => ["a", "b", "c", "d", "e"] ', какие результаты в 'h # => {" a "=>" a "," b "=>" b "," c "=>" c "," d "=>" d "," e "=>" е "}'. –

2

Это еще один способ сделать это:

foo = ['a', 'b', 'c', 'd', 'e'] 
foo.inject({}){ |h,k| h[k] = k; h } 

Как предлагаемый в комментариях, лучшие варианты этого ответа используют each_with_object, поэтому он избавляется от t перил ; h:

foo.each_with_object({}) { |e,h| h[e]=e } 

Преимущество либо не в том, что никакого промежуточного массива строится.

Но, как вы упомянули будет работать нормально:

Hash[foo.map{|a| [a, a]}] 
+5

Я предлагаю вам избавиться от надоедливого '; h', написав' foo.each_with_object ({}) {| e, h | h [e] = e} '. В любом случае, это имеет то преимущество, что, в отличие от 'zip', тогда' Hash [] 'или' to_h', промежуточный массив не создается. –

+0

Согласовано. 'each_with_object' предпочтительнее« вставлять »в этом случае, во многих случаях, потому что для него не требуется конечный'; h'. –

1

Ваш вопрос не имеет смысла. Я подозреваю, что это проблема XY. Если вы на самом деле не нужно хранить ключ-значение в хэш, но просто нужно вернуть ключ обратно, а затем:

h = Hash.new{|_, k| k} 
h["a"] # => "a" 
+0

@CarySwoveland Вы были быстрее. Восстановите свой ответ. – sawa

+0

Это было слишком близко к evedovelli's, поэтому я оставил комментарий вместо этого. –

+0

Это странный случай использования. Я определяю кучу языков, и я строю таблицу перевода по умолчанию.Поэтому, если у меня есть языки как: ['en', 'fr', 'de', 'ru'] Я хочу легко построить исходный хэш перевода: {'en' => 'en', 'fr' => 'fr', 'de' => 'de', 'ru' => 'ru'}. Вот почему я спрашивал. (обратите внимание, что алгоритм затем проходит через некоторые другие данные и корректирует таблицу переводов, но значение X => X упрощает его использование в моем конкретном случае использования) –

4
foo = ['a', 'b', 'c', 'd', 'e'] 

[foo, foo].transpose.to_h 
#=> {"a"=>"a", "b"=>"b", "c"=>"c", "d"=>"d", "e"=>"e"} 

foo.zip(foo).to_h 
#=> {"a"=>"a", "b"=>"b", "c"=>"c", "d"=>"d", "e"=>"e"} 
+0

Хорошая работа, Бабар! Мне нравятся эти –

0

Я хотел бы попробовать это:

foo = ['a', 'b', 'c', 'd', 'e'] 
hash = Hash[foo.zip foo] 
Смежные вопросы