【问题标题】:returning value from nested hashes in Ruby从 Ruby 中的嵌套哈希返回值
【发布时间】:2016-03-02 01:12:40
【问题描述】:

我想在以下哈希中返回 "BBQ" 为值的所有假日符号(即 :memorial_day:fourth_of_july):

holiday_hash = 
      {
         :winter => {
           :christmas => ["Lights", "Wreath"],
           :new_years => ["Party Hats"]
         },
         :summer => {
           :fourth_of_july => ["Fireworks", "BBQ"]
         },
         :fall => {
           :thanksgiving => ["Turkey"]
         },
         :spring => {
           :memorial_day => ["BBQ"]
         }
       }

这是我的代码:

def all_holidays_with_bbq(holiday_hash)
  holiday_hash.each do |season, holiday|
    season.each do |holiday|
      holiday.each do |supply|
        new_array = []
        if supply = "BBQ"
          new_array << supply.keys
        end
        new_array
      end
    end
  end
end

我的代码返回此错误:

NoMethodError:
        undefined method `each' for :winter:Symbol

谢谢!

【问题讨论】:

    标签: ruby hash iteration


    【解决方案1】:

    @KMRakibulIslam 已经回答了您的问题,但这是另一种我认为非常类似于 Ruby 的方法:

    holiday_hash.values.
                 flat_map(&:to_a).
                 select { |_,a| a.include?("BBQ") }.
                 map(&:first)
      #=> [:fourth_of_july, :memorial_day] 
    

    步骤如下:

    a = holiday_hash.values
      #=> [{:christmas=>["Lights", "Wreath"], :new_years=>["Party Hats"]},
      #    {:fourth_of_july=>["Fireworks", "BBQ"]}, {:thanksgiving=>["Turkey"]},
      #    {:memorial_day=>["BBQ"]}] 
    b = a.flat_map(&:to_a)
      #=> [[:christmas, ["Lights", "Wreath"]],
      #    [:new_years, ["Party Hats"]],
      #    [:fourth_of_july, ["Fireworks", "BBQ"]],
      #    [:thanksgiving, ["Turkey"]],
      #    [:memorial_day, ["BBQ"]]] 
    c = b.select { |_,a| a.include?("BBQ") }
      #=> [[:fourth_of_july, ["Fireworks", "BBQ"]],
      #    [:memorial_day, ["BBQ"]]] 
    c.map(&:first)
      #=> [:fourth_of_july, :memorial_day] 
    

    【讨论】:

      【解决方案2】:

      问题:

      您收到此错误:

      NoMethodError:
              undefined method `each' for :winter:Symbol
      

      因为您在符号上调用了.eachseason.each do |holiday| 其中season 是一个符号。相反,您应该像这样遍历哈希元素:holiday_hash[season].each do |key, values| . . .

      解决方案:

      您需要将您的 all_holidays_with_bbq 方法更改为以下内容才能解决此问题:

      def all_holidays_with_bbq(holiday_hash)
        new_array = []
        holiday_hash.keys.each do |season| # iterate over the keys(seasons) in your holiday_hash.
          holiday_hash[season].each do |key, value| # iterate over inner hash where season is the key.            
            new_array << key if value.include? 'BBQ'
          end
        end
        new_array
      end
      
      p all_holidays_with_bbq(holiday_hash)
      # => [:fourth_of_july, :memorial_day]
      

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 2013-12-17
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多