【问题标题】:Trying to loop through items in a hash and return only certain ones尝试遍历哈希中的项目并仅返回某些项目
【发布时间】:2012-07-22 06:20:15
【问题描述】:

我有以下函数将 URL 解码为由 URL 的不同部分组成的哈希。例如,在我分配hash 的第一行之后,我收到以下输出:

>> CGI.parse(URI.parse("http://google.com/?foo=bar&baz=hello").query)
=> {"foo"=>["bar"], "baz"=>["hello"]}

在这个函数中,如果键是“p”或“q”,我会尝试提取值。我基本上想将哈希过滤成我想要的键和值。

我的目标是只显示某人搜索的关键字,例如 brickcement

这是我的功能:

  def self.get_search_terms(search_url)
    hash = CGI.parse(URI.parse(URI.encode(search_url)).query) #returns a hash
    keywords = []
    hash.each do |key|
      if key["q"] != nil || 
        key["p"] != nil
        keywords << key
      end
    end
    keywords
  end

【问题讨论】:

    标签: ruby-on-rails ruby loops hash


    【解决方案1】:

    一种方法:

    def self.get_search_terms(search_url)
      hash = CGI.parse(URI.parse(URI.encode(search_url)).query)
      keywords = []
      hash.each do |key, value|
        if key == 'p' || key == 'q'
          keywords << value
        end
      end
      keywords
    end
    

    【讨论】:

    • 感谢您的回答。我将把它标记为正确,因为它的代码更简洁。
    【解决方案2】:

    更惯用的 ruby​​ 方式,本质上是单行:

    def self.get_search_terms(search_url)
      CGI.parse(URI.parse(URI.encode(search_url)).query).values_at('q','p')
    end
    

    Hash#values_at

    如果要消除空参数,请在其中添加拒绝空白:

    .values_at('q','p').reject(&:blank?)
    

    【讨论】:

      【解决方案3】:

      可能是 100 种方法之一!

      def self.get_search_terms(search_url)
        myhash = CGI.parse(URI.parse(URI.encode(search_url)).query) 
        keywords = []
        ["p","q"].each do |mykey|
           if myhash.has_key?(mykey)
             keywords << myhash[mykey]
           end
        end
        keywords
      end
      

      或许

      def self.get_search_terms(search_url)
        myhash = CGI.parse(URI.parse(URI.encode(search_url)).query) 
        keywords = []
        mykeywords = ["p","q"]
        mykeywords.each do |mykey|
          if myhash.has_key?(mykey)
            keywords << myhash[mykey]
          end
        end
        keywords
      end
      

      在这两个版本中,您正在寻找的关键字列表是初始循环。您使用以下方法隐式迭代从 URI 中提取的哈希:

      myhash.has_key?

      这将遍历我的哈希,如果它包含键,则将键的值添加到关键字。

      【讨论】:

      • 感谢拉德布拉德。我对 ['p','q'] 行有点困惑。每个都做 |mykey|。你为什么在这里对 ['p'] 和 ['q'] 做一个 .each?
      • 这只是一个非常简单的方法。我会更新帖子以显示另一个版本,希望能说清楚
      猜你喜欢
      • 1970-01-01
      • 2020-07-21
      • 2013-08-20
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 2014-07-31
      相关资源
      最近更新 更多