从哈希数组中收集数值

77

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

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

有没有一种高效的方法可以将:price的值作为类似于[1,2,3]的数组获取?


1
你提供的示例不是有效的 Ruby 语法。(如果没有有效的示例,我们无法帮助您)。此外,如果您能向我们展示您已经尝试过的内容,那将会很有帮助。 - tessi
1
我们需要看到您解决这个问题的尝试。如果没有您的代码,那么看起来您只是在请求别人为您编写代码,这是一个让您的问题被关闭的好方法。否则,我们可以简单地说,“是的,有一种有效的方法可以获取这些值”,并留给您自己去解决。您更喜欢哪种方式? - the Tin Man
可能问题应该交换 { }[ ] 括号(使其成为哈希数组)。我刚刚尝试了5分钟寻找现有的问题(我真的相信这是一个重复的问题),但我认为SO已经将答案埋藏在更复杂的示例下面。 - Neil Slater
8
请现在使用 data_hash.pluck(:price),我的天啊。 - Rambatino
3
@Rambatino pluck是Rails中的一个方法。这是一个关于Ruby语言的通用问题。 - Parker Kemp
@ParkerKemp 告诉我我很天真,你是对的,在这里没有 Rails 参考,并且该功能确实来自 Rails。 - Rambatino
3个回答

134

首先,如果您正在使用 Ruby < 1.9:

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

然后获取您需要的内容:

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

3
“hash”的更新语法是正确的,但此时data_hash这个命名不准确。建议原作者使用data_hashesdata_array,两者都比较合适。 - the Tin Man
哎呀,你说得对。已经更正了。 - Zabba

4
有一个封闭的问题,重定向到这里询问如何将符号(Symbol)传递给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)


2
如果使用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 的,所以我不会期望速度有所提升。


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