Ruby搜索哈希和数组的数组

时间:2017-11-29 17:42:31

标签: arrays ruby

我有一个哈希数组,其中还包含一个数组:

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' }

[]

如何搜索角色数组以查找我的计算机的匹配项?

3 个答案:

答案 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