我有一个以下格式的数据结构:
data_hash = [
{ price: 1, count: 3 },
{ price: 2, count: 3 },
{ price: 3, count: 3 }
]
有没有一种高效的方法可以将:price
的值作为类似于[1,2,3]
的数组获取?
首先,如果您正在使用 Ruby < 1.9:
array = [
{:price => 1, :count => 3},
{:price => 2, :count => 3},
{:price => 3, :count => 3}
]
然后获取您需要的内容:
array.map{|x| x[:price]}
data_hash
这个命名不准确。建议原作者使用data_hashes
或data_array
,两者都比较合适。 - the Tin Manmap
函数来派生键值。可以使用可枚举对象作为中间人来完成: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)
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 的,所以我不会期望速度有所提升。
{ }
和[ ]
括号(使其成为哈希数组)。我刚刚尝试了5分钟寻找现有的问题(我真的相信这是一个重复的问题),但我认为SO已经将答案埋藏在更复杂的示例下面。 - Neil Slater