搜索不同哈希的数组

Red*_*ter 0 ruby arrays hash

我有一个哈希数组,每个哈希都有非规范化的值,如下所示:

arr = [{
    id: 0,
    type: 'character',
    person: {
      name: 'Steve Rogers',
      weapon: 'Shield',
      known: true
    }
  },
  {
    id: 1,
    type: 'organization',
    company: "Pym Industries",
    tech: 'Shrinking suit'
  },
  {
    id: 2,
    type: 'character',
    person: {
      name: 'Tony Stark',
      weapon: 'Ironman Suit',
      known: false
    }
  }]
Run Code Online (Sandbox Code Playgroud)

一些哈希是不同的.我想获得哈希值,其人我知道,也就是的一个子,arr.person.knowntrue.结果应该是:

subarr = [{
    id: 0,
    type: 'character',
    person: {
      name: 'Steve Rogers',
      weapon: 'Shield',
      known: true
    }
  }]
Run Code Online (Sandbox Code Playgroud)

我试过了:

b = arr.select{|x| x.person.known}
b = arr.reject{|x| if x.person then x.person.known}
Run Code Online (Sandbox Code Playgroud)

但我碰到了NoMethodError: undefined method `person' for Hash:0x007fc5f6f587f0.

Urs*_*sus 6

试试这个吧

arr.select { |item| item.fetch(:person, {})[:known] }
Run Code Online (Sandbox Code Playgroud)

要么

arr.select { |item| (item[:person] || {})[:known] }
Run Code Online (Sandbox Code Playgroud)

或者,来自Ruby 2.3.0

arr.select { |item| item.dig(:person, :known) }
Run Code Online (Sandbox Code Playgroud)

更冗长但也许更清晰

arr.select do |item|
  person = item.fetch(:person, {})
  person[:known]
end
Run Code Online (Sandbox Code Playgroud)

要么

arr.select { |item| item[:person] && item[:person][:known] }
Run Code Online (Sandbox Code Playgroud)