我想最终得到一系列哈希值。
我从一系列代码开始:
@codes = ['123', '456', '789']
我接受每个代码并使用它们点击API,它返回我在循环中解析为变量的值,如下所示:
@codes.each do |x|
@y = x.get_some_data
@brand = @y[brand]
@size = @y[size]
end
然后我想把这些数据放入一个哈希数组
merged_array = []
final_hash = @codes.map{|code| {:code => code, :brand=> @brand, :size=> @size}
merged_array << final_hash
在一个完美的世界中,最终会在merged_array
中找到这样的哈希:
{:code => '123', :brand=> 'nike', :size=> 8 }
{:code => '456', :brand=> 'adidas', :size=> 4 }
{:code => '789', :brand=> 'converse', :size=> 10 }
但是当我运行我的脚本时,它会正确映射代码,但会覆盖@brand
,@size
变量,只返回最后一个循环的值。
不确定如何将所有变量都放入哈希值?
答案 0 :(得分:3)
在您的代码示例中,变量都被声明为实例变量,因为它们的前缀是@
。
但是,循环中的变量只是工作/临时变量,而不是实例变量。此外,x.get_some_data
可能无效,因为x
只是循环变量并包含456
,abc
等,而不是具有所需方法的对象。因此,以下代码应该产生您想要的结果:
def get_data(codes)
result = []
codes.each do |code|
y = get_some_data(code)
result << {
code: code,
brand: y['brand'],
size: y['size']
}
end
result
end
这是一个非常冗长的例子;如果map
的返回值允许,您可以将整个逻辑放在get_some_data
中。
更优雅的版本会使用Enumerable#each_with_object(Array
类包含Enumereable
):
def get_data(codes)
codes.each_with_object([]) do |code, result|
y = get_some_data(code)
result << {
code: code,
brand: y['brand'],
size: y['size']
}
end
end
谢谢,Cary Swoveland,指出这个!
答案 1 :(得分:1)
这应该做的工作
@codes.map{|code| {:code => code, :brand => code.get_some_data['brand'], code.get_some_data['size']}}
但是,我真的不确定 String.get_some_data 会给你什么。例如: - '123'.get_some_data['brand']