我有这个:
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 = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
>> hash.values
=> [["a", "b", "c"], ["b", "c"]]
map
),但我还是会点赞,因为我非常喜欢这个! - Michael DurrantHash#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我会使用:
hash.map { |key, value| value }
Hash#values
更复杂的等效方法。 - Mark Thomashash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]]
Enumerable#collect
接受一个块(block),并返回在可枚举对象的每个元素上运行一次该块后的结果数组。因此,这段代码只忽略键(key),并返回所有值(values)的数组。
Enumerable
模块非常强大。熟练掌握它可以节省大量时间和代码。
hash.values
最终是正确的答案。 - tadmanhash.map(&:second)
:) - Jaap Haagmans就像这样简单。
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"]]
hash = { :a => ["a", "b", "c"], :b => ["b", "c"] }
hash.values #=> [["a","b","c"],["b","c"]]
hash = { foo: "bar", baz: "qux" }
hash.map(&:last) #=> ["bar", "qux"]
为什么它有效:
&
在对象上调用 to_proc
方法,并将其作为块传递给方法。
something {|i| i.foo }
something(&:foo)
hash.values
更好)。但我想指出,如果您向Hash#each
提供一个块,则它将只返回哈希的完整值。如果您想对每个项执行操作并将其作为数组返回,请使用Hash#collect
或其别名Hash#map
。有关可枚举内容的更多信息此处。 - brymck