2017-08-11 18 views
3

私は.mapを使用しようとしているので、製品配列を初期化する必要はありません。ここで範囲でRubyマップを使用

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

私が試したものです::

ここでは、元のコードは、唯一の最初の製品を返す

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 

を?私は間違って何をしていますか?

ShopifyAPI :: Productは、送信されたパラメータページと制限に基づいて製品のリストを返します。

答えて

1

私はあなたが第二のスニペットを見つけている理由だけで最初の製品を返しますが、最初に、それは機能的に同等にするために、あなたはここでflat_mapの代わりmapを使用することができ、あるいは.flattenにタックわからないんだけど最後に(またはflatten(1)、あなたはより具体的にしたい場合)

.find呼び出しは配列を返すことを考えると、あなたは次の例の違い見ることができます:array + arrayを兼ね備えているためだ

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] 

を彼らの二人。

代わりにproducts.push(<find result>)を最初のスニペットで使用した場合、同じネストされた配列結果が表示されます。

Enumerable#flat_map参照してArray#flatten

+0

flat_mapはトリックをしました!ありがとう、私は何か新しいことを学んだ! – ByteMe

+0

'(0..2).flat_map {| x | [x]} '=>'(0..2).to_a'? –

+0

@AndreyDeinekoええ、あなたは正しいですが、質問には配列を返す各繰り返しがあったので、それはできません –

関連する問題