我有一个哈希数组,每个哈希都有非规范化的值,如下所示:
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.known是true.结果应该是:
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.
试试这个吧
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)