这是一个数组示例:
{"C1"=>[
{:upc=>"51857195821952", :product_id=>"1234", :name=>"name", :price=>" $15 ", :color=>"green", :size=>"L", :description=>"descr"},
{:upc=>"352353wegs", :product_id=>"456", :name=>"name2", :price=>"$21", :color=>"black", :size=>"S", :description=>"descr"}, # ...
],
#...
}
在这里,当我尝试从该数组中获取数据时:
@array.each do |p|
product = Product.new
product.sku = p[0]
product.name = p[1][0][:name] #can't convert Symbol into Integer
price = p[1].select{ |pr| !pr[:price].nil? and pr[:price] != "0" }.min_by{ |i| i[:price].to_f }[:price]
product.price = "%.2f" % (price.to_f)
...
end
每当我尝试从数组中获取数据时,我都会遇到product.name =
行,错误无法将符号转换为整数。
这种情况有什么问题?我花了一个下午的时间讨论这个问题,但遗憾的是我仍然无法弄明白......
谢谢你
答案 0 :(得分:4)
您的@array
实际上是一个哈希值。它形成如下:
{
'name1' => [{:upc => "..."},{:upc => "..."}],
'name2' => [{:upc => "..."},{:upc => "..."}],
#...
}
由于它是Hash,你可以在each
(也适用于map
)方法中使用2个参数(一个用于键,另一个用于值):
@array.each do |name, array|
product = Product.new
product.sku = name # returns "C1"
array.each do |data|
data[:upc]
data[:name]
#etc...
end
end
答案 1 :(得分:0)
基本问题是您在上面显示的示例数组实际上是而不是数组。它是一个带键值对的哈希。因此,您的代码p[0]
或p[1][0]
没有意义,因为散列没有index
类似的数组。哈希没有订购。使用“键”而非“数组”之类的“索引”访问哈希值。
迭代哈希的键值对就是这样的。
1.9.3p194 :001 > x = {:x => 10, :y => 9, :z => 10}
=> {:x=>10, :y=>9, :z=>10}
1.9.3p194 :002 > x.each do |key, value|
1.9.3p194 :003 > puts "#{key} : #{value}"
1.9.3p194 :004?> end
x : 10
y : 9
z : 10
=> {:x=>10, :y=>9, :z=>10}
答案 2 :(得分:0)
看起来你可能会混淆阵列和哈希。
鉴于此:
@array = {"C1"=>[
{:upc=>"51857195821952", :product_id=>"1234", :name=>"name", :price=>" $15 ", :color=>"green", :size=>"L", :description=>"descr"},
{:upc=>"352353wegs", :product_id=>"456", :name=>"name2", :price=>" $21 ", :color=>"black", :size=>"S", :description=>"descr"}
] }
然后@array.class.name
为Hash
您可以通过以下方式访问实际数组:
@actual_array = @array["C1"]
然后,@actual_array.class.name
将为Array
所以,采取这种方法并重写:
@array = {"C1"=>[
{:upc=>"51857195821952", :product_id=>"1234", :name=>"name", :price=>" $15 ", :color=>"green", :size=>"L", :description=>"descr"},
{:upc=>"352353wegs", :product_id=>"456", :name=>"name2", :price=>" $21 ", :color=>"black", :size=>"S", :description=>"descr"}
] }
@actual_array = @array["C1"]
@actual_array.each do |p|
puts p[:name]
end
如果你这样做,你会发现:name
元素的值将被整齐地打印出来。