我有一个哈希数组,其中还包含一个数组:
machines = [{ 'name' => 'ldapserver1', 'ip' => '10.199.0.10',
'role' => ['server', 'initial'] },
{ 'name' => 'ldapserver2', 'ip' => '10.199.0.11',
'role' => ['server', 'secondary'] },
{ 'name' => 'ldapclient1', 'ip' => '10.199.0.12',
'role' => 'client' },
{ 'name' => 'ldapclient2', 'ip' => '10.199.0.13',
'role' => 'client' }]
我想搜索它以获得具有匹配角色的机器。
我可以使用它来获取具有客户端角色的计算机:
results = @machines.select { |machine| machine['role'] == 'client' }
[{"name"=>"ldapclient1", "ip"=>"10.199.0.12", "role"=>"client"}, {"name"=>"ldapclient2", "ip"=>"10.199.0.13", "role"=>"client"}]
但是当我尝试搜索角色数组时,这会破坏:
results = machines.select { |machine| machine['role'] == 'server' }
[]
如何搜索角色数组以查找我的计算机的匹配项?
答案 0 :(得分:4)
这是Enumerable#grep
的完美用例:
machines.reject { |m| [*m['role']].grep('server').empty? }
这里使用splat从Array
实例和String
实例生成数组。
答案 1 :(得分:2)
根据您的代码,角色可以是字符串或数组,因此可以使用以下
进行检查results = machines.select { |machine| Array(machine['role']).include?('server') }
更新:使用Array,此方法尝试通过调用to_ary创建数组,然后调用其参数的to_a。
答案 2 :(得分:1)
这是因为'role'
可以是字符串或数组。
使用#include?
将匹配字符串的一部分,如果它是一个字符串。或者完全匹配数组中的字符串。
尝试:
results = machines.select { |machine| machine['role'].include?('server') }
或更强大
results = machines.select do |machine|
r = machine['role']
if r.is_a? String
r == 'server'
else
r.include?('server')
end
end