Ruby 在哈希数组中查找值

Ruby 在哈希数组中查找值,ruby,Ruby,如何从标记列表中获取指定名称的标记 例如,我想提取用户的标签 如果没有do迭代器,这是否可以实现 这将返回:tag键的内容,用于==“fine” taglist = [{:name=>"Daniel_Xu_Forever", :tag=>["helo", "world"]}, {:name=>"kcuf", :tag=>["hhe"]}, {:name=>"fine", :tag=>[]}, {:name=>"how hare you",

如何从标记列表中获取指定名称的标记

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


如果没有
do
迭代器,这是否可以实现

这将返回
:tag
键的内容,用于
==“fine”

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.select { |x| x[:name] == 'fine' }.map { |u| u[:tag] }
我只是想说傻话,不如:

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

因此,我的第一个答案忽略了“不”
do
规则。 下面是一个不使用
do
块的答案

eval taglist.to_s[/:name=>"fine", :tag=>(.*?)}/, 1]
#=> []
i=0
开始
如果标记列表[i][:name]=“好”
tag=taglist[i][:tag]
打破
结束
i+=1
当i

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

不,没有循环就无法完成

即使您找到了代码避免循环的解决方案,也要确保您正在调用的库函数将包含一个循环。在数组中查找元素需要循环。句号

例如,以这个(人为的)例子

它似乎不使用循环,而是调用使用循环实现的
grep

或者另一个同样做作的例子

  pattern = "fine"
  def pattern.===(h); self == h[:name]; end
  taglist.grep(pattern)
它似乎在没有循环的情况下再次调用
groupby
,但实际上是这样


所以答案是,不。

它必须是一个哈希数组吗?如果不是,请使用
taglist={:kcuf=>[“hhe”],:fine=>[]…}
是的,它必须是一个哈希数组!使用块进行迭代有什么问题?“没有
do
iterator,这能实现吗?”是的,一个荒谬的条件,但这是“问题”的一部分。哈哈,星期天早上没有戴眼镜。。。我想你也错过了问题的“使用Ruby解决这个问题,但不要使用Ruby”部分:)我想知道JSON编码散列并使用
%x[…]
将其馈送到Python脚本是否符合解决方案的要求。嗯,
while
有一个隐式的
do
。是的。。。我想不出任何迭代器不占用块..:/
  pattern = "fine"
  def pattern.===(h); self == h[:name]; end
  taglist.grep(pattern)
  class Hash; def method_missing(sym); self[sym]; end; end
  taglist.group_by(&:name)["fine"]