返回基于哈希元素匹配的哈希数组

时间:2013-01-27 04:13:53

标签: ruby hash

我想知道如何搜索哈希数组并根据搜索字符串返回值。例如,@contacts包含哈希元素::full_name:city:email。变量@contacts(我猜它将是一个数组)包含三个条目(可能是行)。以下是我到目前为止基于:city值进行搜索的代码。然而,它不起作用。谁能让我知道发生了什么?

def search string
  @contacts.map {|hash| hash[:city] == string}
end

2 个答案:

答案 0 :(得分:2)

您应该使用select代替map

def search string
  @contacts.select { |hash| hash[:city] == string }
end

在您的代码中,您尝试使用块生成map(或转换)数组,从而产生布尔值。 map接受一个块并为self的每个元素调用块,构造一个包含块返回的元素的新数组。结果,你得到了一系列布尔值。

select的作用相似。它需要一个块并迭代数组,但不是转换源数组,而是返回一个包含块返回true的元素的数组。所以这是一种选择(或过滤)方法。

为了理解这两种方法之间的区别,查看它们的示例定义很有用:

class Array
  def my_map
    [].tap do |result|
      self.each do |item|
        result << (yield item)
      end
    end
  end

  def my_select
    [].tap do |result|
      self.each do |item|
        result << item if yield item
      end
    end
  end
end

使用示例:

irb(main):007:0> [1,2,3].my_map { |x| x + 1 }
[2, 3, 4]
irb(main):008:0> [1,2,3].my_select { |x| x % 2 == 1 }
[1, 3]
irb(main):009:0>

答案 1 :(得分:1)

你可以试试这个:

 def search string
    @contacts.select{|hash| h[:city].eql?(string) }
 end

这将返回一个与字符串匹配的哈希数组。