0

我想知道如何搜索散列数组并根据搜索字符串返回一个值。例如,@contacts包含哈希元素::full_name:city:email。变量@contacts(我猜它是一个数组)包含三个条目(可能是行)。以下是我迄今为止根据:city价值进行搜索的代码。但是它不起作用。谁能给我一个想法是怎么回事?

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

2 回答 2

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>
于 2013-01-27T04:18:48.677 回答
1

你可以试试这个:

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

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

于 2013-01-27T04:17:41.073 回答