我想知道如何搜索散列数组并根据搜索字符串返回一个值。例如,@contacts
包含哈希元素::full_name
、:city
和:email
。变量@contacts
(我猜它是一个数组)包含三个条目(可能是行)。以下是我迄今为止根据:city
价值进行搜索的代码。但是它不起作用。谁能给我一个想法是怎么回事?
def search string
@contacts.map {|hash| hash[:city] == string}
end
您应该使用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>
你可以试试这个:
def search string
@contacts.select{|hash| h[:city].eql?(string) }
end
这将返回与字符串匹配的哈希数组。