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
假设我有这样一种数据结构:
{
"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