2012-03-12 42 views
2

我正在寫去一個哈希散列的散列值Ruby代碼....確定是否鑰匙鏈是existant在哈希

amz_price_info.raw["Offers"]["Offer"]["OfferListing"]["Price"]["FormattedPrice"] 

我要訪問此僅當代碼的結構體可用時才進行編碼。目前,我的代碼是這樣的:

#amz_price_info.raw.class == Hashie::Mash 
    price = if amz_price_info.raw["Offers"] 
     if amz_price_info.raw["Offers"]["Offer"] 
      if amz_price_info.raw["Offers"]["Offer"]["OfferListing"] 
       if amz_price_info.raw["Offers"]["Offer"]["OfferListing"]["Price"] 
        if amz_price_info.raw["Offers"]["Offer"]["OfferListing"]["Price"]["FormattedPrice"] 
         amz_price_info.raw["Offers"]["Offer"]["OfferListing"]["Price"]["FormattedPrice"] 
        end 
       end 
      end 
     end 
    end 

我該如何重構我的代碼以減少冗長?

回答

5

這是一種方法,如果你不想定義額外的方法或引入一些庫。

amz_price_info.raw 
.fetch("Offers", {}) 
.fetch("Offer", {}) 
.fetch("OfferListing", {}) 
.fetch("Price", {}) 
.fetch("FormattedPrice", nil) 
3

這個方法可以讓你搜索下一個哈希任何數字鍵,返回nil如果路徑不存在:

def find_value(hash, keys) 
    keys.inject(hash.dup) do |prev, key| 
    prev && prev[key] ? prev[key] : nil 
    end 
end 

例子:

info = { "Offers" => { "Offer" => { 
     "OfferListing" => { "Price" => 
     { "FormattedPrice" => 10 }}}}} 

keys = %w[Offers Offer OfferListing Price FormattedPrice] 
puts find_value(info, keys)    # => 10 
puts find_value({"Offers" => {}}, keys) # => nil 
2

通過louism我會啓發這樣做:

keys = %w[Offers Offer OfferListing Price FormattedPrice] 
price = amz_price_info.raw 
keys.each{|k| price = (price||{})[k]} 

編輯:由Niklas在評論

# This will return price or nil 
keys.inject(amz_price_info.raw) { |price, k| (price || {})[k] } 
+4

這也可以寫成'keys.inject(amz_price_info.raw){ |價格,k | (價格|| {})[K]}' – 2012-03-13 00:00:44