确定哈希中是否存在一系列键。

4

我正在编写一些Ruby代码,它可以访问哈希表的哈希表中的值...

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

如何重构我的代码,使其更简洁?

4个回答

8

如果您不想定义额外的方法或引入某些库,这是一种方法。

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]}

edit: as noted by Niklas in comment

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

4
这也可以写成 keys.inject(amz_price_info.raw) { |price, k| (price || {})[k] } - Niklas B.

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接