Ruby 中是否有一种优雅的方法来过滤哈希数组的哈希?

Is there an elegant way in Ruby to filter a hash of arrays of hashses?

假设我有这样一种数据结构:

{
  "foo": [{state: on}, {state: off}, {state: on}],
  "bar": [{state: off}, {state: off}, {state: on}],
  "baz": [{state: on}, {state: on}, {state: on}]
}

如何以优雅的方式过滤嵌套的哈希数组,以便取回:

{
  "foo": [{state: on}, {state: on}],
  "bar": [{state: on}],
  "baz": [{state: on}, {state: on}, {state: on}]
}
a={
    "foo": [{state: "on"}, {state: "off"}, {state: "on"}],
    "bar": [{state: "off"}, {state: "off"}, {state: "on"}],
    "baz": [{state: "on"}, {state: "on"}, {state: "on"}]
}

代码

p a.transform_values{|arr| arr.select{|h|h[:state].eql?'on'}}

结果

{:foo=>[{:state=>"on"}, {:state=>"on"}], :bar=>[{:state=>"on"}], :baz=>[{:state=>"on"}, {:state=>"on"}, {:state=>"on"}]}

鉴于:

data = {
  "foo": [{state: :on}, {state: :off}, {state: :on}],
  "bar": [{state: :off}, {state: :off}, {state: :on}],
  "baz": [{state: :on}, {state: :on}, {state: :on}]
}

使用#transform_values迭代替换hash值,#select过滤数组中的元素:

data.transform_values do |value|
  value.select { |hash| hash[:state] == :on  }
end