2011-01-10 148 views
0

我正在嘗試從對象數組中創建對象屬性的新哈希。我正在通過ruby aaws gem使用Amazon API,並且我無法弄清楚如何遍歷API返回的數組,以便它只會訪問屬性而不是整個數組。當我運行下面的代碼時,它會返回整個數組。從Ruby中的對象數組返回對象屬性

def self.amazon(search) 
    keywords = "#{search}" 
    resp = Amazon::AWS.item_search('Books', { 'Title' => keywords }) 
    items = resp.item_search_response[0].items[0].item 
    items.each do |attribs| 
     a = attribs.item_attributes 
     @results = [] 
     @results << {:label => "#{a.title.to_s[0,85] unless a.title.nil?}", 
       :value => "#{a.title.to_s unless a.title.nil?}", 
       :img => "#{attribs.medium_image.url.to_s unless attribs.medium_image.url.nil?}""" 
       } 

    end 
    end 

我需要修改循環,但我不知道確切的地方我錯了。

回答

0

你可以避免創建@results變量,你需要明確地返回可枚舉#地圖的方法,是這樣的:

items.map do |attribs| 
    a = attribs.item_attributes 
    {:label => "#{a.title.to_s[0,85] unless a.title.nil?}", 
      :value => "#{a.title.to_s unless a.title.nil?}", 
      :img => "#{attribs.medium_image.url.to_s unless attribs.medium_image.url.nil?}" 
    } 
end 

可枚舉#地圖返回運行在接收陣列中的每個項目提供的塊的返回值的陣列。所以如果原始方法的意圖是返回@results,那麼使用map可能會更好。順便說一句,即使您將'return @results'放在方法末尾,它也只會給出在循環的最後一次迭代中計算出的屬性,因爲您每次都將@results重置爲[]該塊被調用。您可以通過在循環之前將@results初始化爲[]或通過完全避免使用map來避免這種情況。

2

each方法返回它正在操作的數組 - 在這種情況下,items。它看起來像你想要返回@results,而是。您似乎還在每次傳球時將@results初始化回[]。在循環外部移動@results = [],並在循環後添加明確的return @results或(更慣用)@results。不過,您可能想要查看map方法。有了它,你可以這樣做:

@results = items.map do |attribs| 
    a = attribs.item_attributes 
    {:label => "#{a.title.to_s[0,85] unless a.title.nil?}", 
    :value => "#{a.title.to_s unless a.title.nil?}", 
    :img => "#{attribs.medium_image.url.to_s unless attribs.medium_image.url.nil?}" 
    } 
end 

這應該設置你的變量並返回它,只要它是方法中的最後一條語句。 (我假設你需要以後設置@results - 如果你不這樣做,你可以完全拋棄它。)