在范围上使用Ruby地图

Byt*_*eMe 4 ruby

我正在尝试使用.map,所以不需要初始化product数组。

这是原始代码:

products = []
for page in (1..(ShopifyAPI::Product.count.to_f/150.0).ceil)
  products += ShopifyAPI::Product.find(:all, :params => {:page => page, :limit => 150})
end
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

products = (1..(ShopifyAPI::Product.count.to_f/150.0).ceil).map do |page|
  ShopifyAPI::Product.find(:all, :params => {:page => page.to_i, :limit => 150})
end
Run Code Online (Sandbox Code Playgroud)

哪个只返回第一个产品?我究竟做错了什么?

ShopifyAPI :: Product根据发送的参数页面和限制返回产品列表。

max*_*ner 5

我不知道为什么你发现第二个片段只返回的第一个产品,但为了使其功能上等同于第一,你可以使用flat_map,而不是map在这里,或者粘在.flatten末(或者flatten(1),如果您想更具体一点)

给定.find调用返回的数组,您可以在以下示例中看到差异:

a = []
(0..2).each { |x| a += [x] }
# a == [0,1,2]

(0..2).map { |x| [x] }
# [[0], [1], [2]]

(0..2).flat_map { |x| [x] }
# [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

这是因为array + array将两者结合在一起。

如果使用第一个代码段,products.push(<find result>)则会看到相同的嵌套数组结果。

请参见Enumerable#flat_mapArray#flatten