3

这是一个数组示例:

{"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 =错误can't convert Symbol into Integer

在这种情况下有什么问题?我花了一个下午的时间在这个问题上,但不幸的是我仍然无法弄清楚......

谢谢你

4

3 回答 3

5

@array实际上是一个哈希。它的格式如下:

{ 
  'name1' => [{:upc => "..."},{:upc => "..."}],
  'name2' => [{:upc => "..."},{:upc => "..."}],
  #...
}

由于它是一个哈希,您可以在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
于 2013-02-27T21:26:15.270 回答
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} 
于 2013-02-27T21:30:00.013 回答
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.nameHash

您可以通过像这样访问它来获取实际的数组:

@actual_array = @array["C1"]

那么,@actual_array.class.nameArray

因此,采用这种方法并重写:

@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元素的值会被整齐地打印出来。

于 2013-02-27T21:33:23.417 回答