优雅地 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