尝试循环哈希中的项目并仅返回某些项目

时间:2012-07-23 23:59:55

标签: ruby-on-rails ruby loops hash

我有以下函数将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

3 个答案:

答案 0 :(得分:3)

一种方法:

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

答案 1 :(得分:1)

更惯用的红宝石方式,基本上是一个衬垫:

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?)

答案 2 :(得分:0)

可能是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?

这将迭代我的哈希值,如果它包含密钥,则将密钥的值添加到关键字。