2012-03-05 5 views
91

у меня есть это:рубин Hash на массив значений

hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 

, и я хочу, чтобы добраться до этого: [["a","b","c"],["b","c"]]

Это кажется, что это должно работать, но это не делает:

hash.each{|key,value| value} 
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 

Любые предложения?

+0

Ниже приведены правильные ответы ('hash.values' является лучшим IMO). Но я хотел бы указать, когда вы предоставляете блок 'Hash # each', он просто вернет полное значение хэша. Если вы хотите выполнить операцию над каждым элементом и вернуть его как массив, используйте 'Hash # collect' или его псевдоним' Hash # map'. Подробнее о перечислениях [здесь] (http://ruby-doc.org/core-1.9.3/Enumerable.html). – brymck

+3

Этот вопрос выглядит странно знакомым ... Интересно, сколько людей сейчас работает над тем же домашним заданием. –

ответ

205

Кроме того, немного проще ....

>> hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 
>> hash.values 
=> [["a", "b", "c"], ["b", "c"]] 

Ruby doc here

+3

+! Острота! Я поддержу, несмотря на наличие конкурирующего ответа (используя «карту»), потому что мне это очень нравится! –

+2

'Hash # values' не только проще, но и эффективнее. Сравните 'time ruby ​​-e '(1..1000000) .reduce ({}) {| h, i | h.store i, i; h} .values'' с 'time ruby ​​-e '(1..1000000) .reduce ({}) {| h, i | h.store i, i; ч} {.map | к, v | v} '' – jordanbtucker

+0

+1 (ослепленный после того, как я попробовал свой код), я провел один день, не удаляя удалять индекс, используя множество методов ... Все, что я могу сказать большое спасибо! : D –

20
hash.collect { |k, v| v } 
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collect принимает блок, и возвращает массив результатов работы блока один раз на каждый элемент перечислимы. Таким образом, этот код просто игнорирует ключи и возвращает массив всех значений.

Модуль Enumerable является довольно устрашающим. Зная это, вы можете сэкономить много времени и много кода.

+1

Не забывайте, что, как и ответ @Ray Toal, 'hash.values' в конечном итоге является правильным ответом здесь. – tadman

+0

Или 'hash.map (&: second)' :) –

32

Я хотел бы использовать:

hash.map { |key, value| value } 
+0

удивлен в нисходящем направлении! Это работает. Я попробовал! –

+2

Я не уменьшил его, но это более сложный эквивалент 'Hash # values'. –

+1

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

5
hash = { :a => ["a", "b", "c"], :b => ["b", "c"] } 
hash.values #=> [["a","b","c"],["b","c"]] 
+0

@karlingen, почему вы обновили мой комментарий? – mrded

+0

http://stackoverflow.com/posts/12771873/revisions, поскольку вы можете видеть, что форматирование вашего кода было отключено – karlingen

2

Существует также это одна:

hash = { foo: "bar", baz: "qux" } 
hash.map(&:last) #=> ["bar", "qux"] 

Почему это работает:

В & вызовы to_proc на объекте, и передает его в качестве блока к методу.

something {|i| i.foo } 
something(&:foo) 
+0

Почему downvote? – karlingen

+0

Это работает. проголосовали :) – kuboon

+0

как это работает, вы можете объяснить, пожалуйста, – jenuine

2

Это так просто, как

hash.values 
#=> [["a", "b", "c"], ["b", "c"]] 

это возвращает новый массив заполняется значениями из хэша

если вы хотите сохранить этот новый массив сделать

array_of_values = hash.values 
#=> [["a", "b", "c"], ["b", "c"]] 

array_of_values 
#=> [["a", "b", "c"], ["b", "c"]] 
Смежные вопросы