我想知道如何搜索哈希数组并根据搜索字符串返回值。例如,@contacts
包含哈希元素::full_name
,:city
和:email
。变量@contacts
(我猜它将是一个数组)包含三个条目(可能是行)。以下是我到目前为止基于:city
值进行搜索的代码。然而,它不起作用。谁能让我知道发生了什么?
def search string
@contacts.map {|hash| hash[:city] == string}
end
答案 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
这将返回一个与字符串匹配的哈希数组。