在哈希数组中查找值

时间:2012-12-09 08:46:04

标签: ruby

taglist = [{:name=>"Daniel_Xu_Forever", :tag=>["helo", "world"]},   
{:name=>"kcuf", :tag=>["hhe"]},  
{:name=>"fine", :tag=>[]},   
{:name=>"how hare you", :tag=>[]},  
{:name=>"heki", :tag=>["1", "2", "3"]}, 
{:name=>"railsgirls", :tag=>[]},  
{:name=>"_byoy", :tag=>[]},   
{:name=>"ajha", :tag=>[]},  
{:name=>"nimei", :tag=>[]}]

如何从taglist

获取指定名称的标签

例如,我想提取用户"fine"的标签?

这可以在没有do迭代器的情况下实现吗?

4 个答案:

答案 0 :(得分:4)

这将返回:tag

的任何用户名的== 'fine'密钥的内容
taglist.select { |x| x[:name] == 'fine' }.map { |u| u[:tag] }

首先,您只选择您感兴趣的用户.select

然后使用.map收集只有你想要的数组。

在这种情况下,最终结果将是:[]

答案 1 :(得分:2)

do真的是迭代器吗?

taglist.find{|tl| tl[:name] == 'fine'}[:tag]

傻到怎么样:

eval taglist.to_s[/:name=>"fine", :tag=>(.*?)}/, 1]
#=> []

答案 2 :(得分:2)

不,没有循环就无法完成。

即使您找到了代码避免循环的解决方案,您确实调用的库函数也会包含循环。在数组中查找元素需要循环。周期。

例如,采取这个(人为的)例子

  pattern = "fine"
  def pattern.===(h); self == h[:name]; end
  taglist.grep(pattern)

似乎没有使用循环,但调用使用循环实现的grep

或另一个同样做作的例子

  class Hash; def method_missing(sym); self[sym]; end; end
  taglist.group_by(&:name)["fine"]

这似乎在没有循环的情况下调用group_by,但实际上确实如此。

所以答案是,不。

答案 3 :(得分:0)

所以我的第一个回答错过了no do规则。 这是一个不使用do块的答案。

i=0
begin
  if taglist[i][:name] == 'fine'
    tag = taglist[i][:tag]
    break
  end
  i+=1
end while i < taglist.length - 0

从技术上讲,我认为这仍然是一个块。但可能满足了限制。

相关问题