优雅地 return 值匹配来自嵌套哈希数组的条件 - 在一行中
Elegantly return value(s) matching criteria from an array of nested hashes - in one line
几天来我一直在寻找这个问题的解决方案,希望有人能提供帮助。鉴于此数据结构:
'foo' => {
'bar' => [
{
'baz' => {'faz' => '1.2.3'},
'name' => 'name1'
},
{
'baz' => {'faz' => '4.5.6'},
'name' => 'name2'
},
{
'baz' => {'faz' => '7.8.9'},
'name' => 'name3'
}
]
}
我需要找到以“4.”开头的 'faz' 的值,而不使用每个。我必须使用“4”。值作为我将在遍历 'bar' 时创建的哈希值的键(如果我还不知道“4”的值,显然我不能这样做),我不想循环两次。
理想情况下,return 对我来说值“4.5.6”会有一个优雅的单行解决方案。
我找到了 this article,但它没有解决这个数据结构的全部复杂性,而且给出的唯一答案过于冗长;循环两次解决方案更具可读性。我在 Rails 4 上使用 Ruby 2.3,但无法升级。有没有 Ruby 高手可以指导我?
您可以使用 select
筛选结果。
data = {'foo' => {'bar' => [{'baz' => {'faz' => '1.2.3'}, 'name' => 'name1'}, {'baz' => {'faz' => '4.5.6'}, 'name' => 'name2'}, {'baz' => {'faz' => '7.8.9'}, 'name' => 'name3'}]}}
data.dig('foo', 'bar').select { |obj| obj.dig('baz', 'faz').slice(0) == '4' }
#=> [{"baz"=>{"faz"=>"4.5.6"}, "name"=>"name2"}]
# or if you prefer the square bracket style
data['foo']['bar'].select { |obj| obj['baz']['faz'][0] == '4' }
答案假定 bar
数组中的每个元素都具有嵌套属性 baz -> faz
.
如果您只期望一个结果,您可以使用 find
。
几天来我一直在寻找这个问题的解决方案,希望有人能提供帮助。鉴于此数据结构:
'foo' => {
'bar' => [
{
'baz' => {'faz' => '1.2.3'},
'name' => 'name1'
},
{
'baz' => {'faz' => '4.5.6'},
'name' => 'name2'
},
{
'baz' => {'faz' => '7.8.9'},
'name' => 'name3'
}
]
}
我需要找到以“4.”开头的 'faz' 的值,而不使用每个。我必须使用“4”。值作为我将在遍历 'bar' 时创建的哈希值的键(如果我还不知道“4”的值,显然我不能这样做),我不想循环两次。
理想情况下,return 对我来说值“4.5.6”会有一个优雅的单行解决方案。
我找到了 this article,但它没有解决这个数据结构的全部复杂性,而且给出的唯一答案过于冗长;循环两次解决方案更具可读性。我在 Rails 4 上使用 Ruby 2.3,但无法升级。有没有 Ruby 高手可以指导我?
您可以使用 select
筛选结果。
data = {'foo' => {'bar' => [{'baz' => {'faz' => '1.2.3'}, 'name' => 'name1'}, {'baz' => {'faz' => '4.5.6'}, 'name' => 'name2'}, {'baz' => {'faz' => '7.8.9'}, 'name' => 'name3'}]}}
data.dig('foo', 'bar').select { |obj| obj.dig('baz', 'faz').slice(0) == '4' }
#=> [{"baz"=>{"faz"=>"4.5.6"}, "name"=>"name2"}]
# or if you prefer the square bracket style
data['foo']['bar'].select { |obj| obj['baz']['faz'][0] == '4' }
答案假定 bar
数组中的每个元素都具有嵌套属性 baz -> faz
.
如果您只期望一个结果,您可以使用 find
。