ruby 从哈希数组中收集值

3bygqnnd  于 2023-03-22  发布在  Ruby
关注(0)|答案(3)|浏览(116)

我有一个如下格式的数据结构:

data_hash = [
    { price: 1, count: 3 },
    { price: 2, count: 3 },
    { price: 3, count: 3 }
  ]

有没有一种有效的方法可以将:price的值作为一个像[1,2,3]这样的数组来获取?

t9eec4r0

t9eec4r01#

首先,如果你使用的是Ruby〈1.9:

array = [
    {:price => 1, :count => 3},
    {:price => 2, :count => 3},
    {:price => 3, :count => 3}
]

然后为了得到你所需要的:

array.map{|x| x[:price]}
2j4z5cfb

2j4z5cfb2#

这里有一个封闭的问题,重定向到询问如何将map交给一个Symbol来派生密钥。这可以使用Enumerable作为中间人来完成:

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)
mm5n2pyu

mm5n2pyu3#

如果使用Rails,您还可以使用以下解决方案,因为Rails修补了类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的,所以我不期望速度的提高。

相关问题