Ruby Hash для масиву значень


118

У мене це:

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"]} 

Будь-які пропозиції?


Наведені нижче відповіді правильні ( hash.valuesтим краще ІМО). Але я хотів зазначити, коли ви надасте йому блок Hash#each, просто повернете повне значення хеша. Якщо ви хочете зробити операцію над кожним елементом і повернути це як масив, використовуйте Hash#collectйого або псевдонім Hash#map. Більше матеріалів про «Перелік» тут .
brymck

3
Це питання виглядає дивним чином знайомим ... Цікаво, скільки людей зараз працює над тим самим домашнім завданням.
Пітер Браун

Відповіді:


261

Також трохи простіше….

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

Рубін док тут


3
+! Вишуканий! Я буду схвалювати, не маючи конкуруючої відповіді (використовуючи map), тому що мені це дуже подобається!
Майкл Дюррант

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; h}.map{|k,v| v}'
jordanbtucker

+1 (Дивно засліплений після того, як я спробував ваш код) я провів один день, не пощастивши, видаливши індекс за допомогою багатьох методів ... Все, що я можу сказати, дякую вам дуже !!! : D
Римляни 8.38-39

2
Чи друкуються ключі в точному порядку, в якому вони відбуваються?
stack1

43

Я б використав:

hash.map { |key, value| value }

3
Я не спростовував цього, але це більш складний еквівалент Hash#values.
Марк Томаса

1
Так, я також підтримав відповідь Рея. Я радий підтримати конкуруючу відповідь, коли мені це теж подобається.
Майкл Дюррант

3
Я думаю, що ми тут не змагаємося, але допомагаємо один одному, правда? :)
witkacy26

Саме те, що я шукав, намагаючись створити масив з хеша, використовуючи його ключі як значення. Дякую :)
Fabian Leutgeb

Корисно, коли вам потрібно одночасно виконати певну логіку з клавішами .
Chris Cirefice

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

Enumerable#collectприймає блок і повертає масив результатів запуску блоку один раз на кожен елемент перелічуваного. Отже цей код просто ігнорує ключі та повертає масив усіх значень.

EnumerableМодуль є досить дивним. Знаючи це добре, ви можете заощадити багато часу та багато коду.


2
Не забувайте, що, як-от відповідь @Ray Toal, hash.valuesв кінцевому рахунку тут правильна відповідь.
тадман

Або hash.map(&:second):)
Jaap Haagmans


4

Це так само просто

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"]]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.