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是更好的IMO)。但是我想指出的是,当您向其提供块时Hash#each,它将仅返回哈希的完整值。如果要对每个项目进行操作并将其作为数组返回,请使用Hash#collect或其别名Hash#map。有关Enumerables的更多信息,请点击此处
brymck 2012年

3
这个问题看起来很陌生……我想知道现在有多少人在从事相同的作业。
彼得·布朗

Answers:


260

而且,简单一点。

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

Ruby文档在这里


3
+!好漂亮!尽管有一个竞争性的答案,我还是会投票赞成(使用map),因为我非常喜欢这个!
Michael Durrant

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
罗马书

2
按键的印刷顺序是否正确?
6

42

我会用:

hash.map { |key, value| value }

3
我没有对此进行投票,但是等效于Hash#values
马克·托马斯

1
是的,我也赞成雷的答案。我也很乐意在竞争激烈的答案上投票。
Michael Durrant 2012年

3
我认为我们不是在这里竞争而是互相帮助,对吗?:)
witkacy26 2013年

正是我在尝试使用其键作为值从哈希创建数组时正在寻找的东西。谢谢:)
Fabian Leutgeb '16

当您还需要同时对按键进行逻辑处理时,此功能很有用。
克里斯·西里菲斯

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

Enumerable#collect接受一个块,并在可枚举的每个元素上返回一次运行该块的结果的数组。因此,此代码仅忽略键并返回所有值的数组。

Enumerable模块非常棒。很好地了解它可以为您节省大量时间和代码。


2
别忘了,就像@Ray Toal的答案一样,hash.values这里最终是正确的答案。
tadman 2012年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.