我有一个如下格式的数据结构:
data_hash = [ { price: 1, count: 3 }, { price: 2, count: 3 }, { price: 3, count: 3 } ]
有没有一种有效的方法可以将:price的值作为一个像[1,2,3]这样的数组来获取?
:price
[1,2,3]
t9eec4r01#
首先,如果你使用的是Ruby〈1.9:
array = [ {:price => 1, :count => 3}, {:price => 2, :count => 3}, {:price => 3, :count => 3} ]
然后为了得到你所需要的:
array.map{|x| x[:price]}
2j4z5cfb2#
这里有一个封闭的问题,重定向到询问如何将map交给一个Symbol来派生密钥。这可以使用Enumerable作为中间人来完成:
map
array = [ {:price => 1, :count => 3}, {:price => 2, :count => 3}, {:price => 3, :count => 3} ] array.each.with_object(:price).map(&:[]) #=> [1, 2, 3]
除了稍微更冗长和更难以理解之外,它也更慢。
Benchmark.bm do |b| b.report { 10000.times { array.map{|x| x[:price] } } } b.report { 10000.times { array.each.with_object(:price).map(&:[]) } } end # user system total real # 0.004816 0.000005 0.004821 ( 0.004816) # 0.015723 0.000606 0.016329 ( 0.016334)
mm5n2pyu3#
如果使用Rails,您还可以使用以下解决方案,因为Rails修补了类Enumerable:
Enumerable
array = [ {:price => 1, :count => 3}, {:price => 2, :count => 3}, {:price => 3, :count => 3} ] array.pluck(:price) #=> [1, 2, 3]
参考:https://api.rubyonrails.org/classes/Enumerable.html#method-i-pluck不幸的是,实现是纯ruby的,所以我不期望速度的提高。
3条答案
按热度按时间t9eec4r01#
首先,如果你使用的是Ruby〈1.9:
然后为了得到你所需要的:
2j4z5cfb2#
这里有一个封闭的问题,重定向到询问如何将
map
交给一个Symbol来派生密钥。这可以使用Enumerable作为中间人来完成:除了稍微更冗长和更难以理解之外,它也更慢。
mm5n2pyu3#
如果使用Rails,您还可以使用以下解决方案,因为Rails修补了类
Enumerable
:参考:https://api.rubyonrails.org/classes/Enumerable.html#method-i-pluck
不幸的是,实现是纯ruby的,所以我不期望速度的提高。