在包含哈希的哈希中搜索

时间:2014-11-25 12:10:49

标签: ruby-on-rails ruby hash

我在Ruby中有以下哈希:

{
    0 => {
        :method=>\"POST \",
        :path=>\"/api/online/platforms/fb/users/191023/add_infos\",
        :host=>\"host.12\",
        :duration=>\"1221\"
    },

    1 => { 
        :method=>\"GET \",
        :path=>\"/api/customer/191023/messages\",
        :host=>\"host.8\",
        :duration=>\"99\"
    }, 

    2 => {
        :method=>\"POST \",
        :path=>\"/logs/data\",
        :host=>\"host.10\",
        :duration=>\"142\"
    },

    3 => {
        :method=>\"POST \",
        :path=>\"/api/customer/191023\", 
        :host=>\"host.6\",
        :duration=>\"243\"
    }

    4 => {
        :method=>\"POST \",
        :path=>\"/api/customer/191023\", 
        :host=>\"host.2\",
        :duration=>\"132\"
    }
}

我想在这些哈希中进行简单搜索,以找到方法键设置为POST且路径键设置为"/api/customer/191023"的那些。相当于data.where(method: "POST", path: "/api/customer/191023")

首先,我仅使用基于select的{​​{1}}进行了尝试:

method

但是返回的哈希是空的。

谢谢。

微米。

1 个答案:

答案 0 :(得分:2)

我看到:method键的值后面有空格,所以请尝试来匹配它,如下所示:

hs = hash.select {|k, h| h[:method] =~ /POST/ && h[:path] == '/api/customer/191023' }

要查找频率最高的主机值,请执行以下操作:

hs = hash.values.group_by { |h| h[:host] =~ /host\.(\d+)/ && $1.to_i || 0 }.to_a
hs.reduce([-1,0]) { |sum,v| v[1].size > sum[1] && [ v[0], v[1].size ] || sum }.first