将Ruby哈希转换为值数组

148

我有这个:

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

有什么建议吗?


2
下面的答案是正确的(在我看来,hash.values 更好)。但我想指出,如果您向 Hash#each 提供一个块,则它将只返回哈希的完整值。如果您想对每个项执行操作并将其作为数组返回,请使用 Hash#collect 或其别名 Hash#map。有关可枚举内容的更多信息此处 - brymck
4
这个问题看起来很熟悉... 我想知道有多少人正在做同样的家庭作业。 - Peter Brown
6个回答

296

此外,还有一个更简单的方法...

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

这里是 Ruby 的文档


3
+1 很棒!尽管我有一个竞争性的答案(使用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 - Romans 8.38-39
2
密钥按照它们的出现顺序精确打印吗? - stack1

51

我会使用:

hash.map { |key, value| value }

4
我没有给它投反对票,但它是一个比 Hash#values 更复杂的等效方法。 - Mark Thomas
1
是的,我也点赞了雷的回答。当我也喜欢一个竞争性的答案时,我很高兴给它点赞。 - Michael Durrant
4
我认为我们在这里不是互相竞争,而是互相帮助,对吧? :) - witkacy26
正是我在尝试使用哈希表的键作为值创建数组时所寻找的。谢谢 :) - Fabian
1
在需要同时对进行一些逻辑操作时非常有用。 - Chris Cirefice
显示剩余2条评论

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

Enumerable#collect 接受一个块(block),并返回在可枚举对象的每个元素上运行一次该块后的结果数组。因此,这段代码只忽略键(key),并返回所有值(values)的数组。

Enumerable 模块非常强大。熟练掌握它可以节省大量时间和代码。


2
不要忘记,就像@Ray Toal的答案一样,hash.values最终是正确的答案。 - tadman
1
或者 hash.map(&:second) :) - Jaap Haagmans

12

就像这样简单。

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

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

正如您所见,您的代码格式完全偏离了。 - karlingen

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

为什么它有效:

& 在对象上调用 to_proc 方法,并将其作为块传递给方法。

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

更深入的解释请参考 http://www.brianstorti.com/understanding-ruby-idiom-map-with-symbol/。 - Sylvain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接