使用 Hash#dig 提取哈希值
Extract Hash values using Hash#dig
h = {
users: {
u_548912: {
name: "John",
age: 30
},
u_598715: {
name: "Doe",
age: 30
}
}
}
给定一个像上面那样的散列,假设我想获取用户 John,我可以做到
h[:users].values.first[:name] # => "John"
在Ruby 2.3中使用Hash#dig
可以做同样的事情:
h.dig(:users, :u_548912, :name) # => "John"
但是考虑到 u_548912
只是一个随机数(事先无法知道),有没有办法仍然使用 Hash#dig
来获取信息?
当然,您可以将表达式作为参数传递给 #dig
:
h.dig(:users, h.dig(:users)&.keys&.first, :name)
#=> John
如果您想要更易读,请提取密钥,但代价是代码行数:
first_user_id = h.dig(:users)&.keys&.first
h.dig(:users, first_user_id, :name)
#=> John
另一种选择是链接您的 #dig
方法调用。这更短,但不太清晰。
h.dig(:users)&.values&.dig(0, :name)
#=> John
恐怕没有"neater"既能安全导航又能做到这一点的方法。
h = {
users: {
u_548912: {
name: "John",
age: 30
},
u_598715: {
name: "Doe",
age: 30
}
}
}
给定一个像上面那样的散列,假设我想获取用户 John,我可以做到
h[:users].values.first[:name] # => "John"
在Ruby 2.3中使用Hash#dig
可以做同样的事情:
h.dig(:users, :u_548912, :name) # => "John"
但是考虑到 u_548912
只是一个随机数(事先无法知道),有没有办法仍然使用 Hash#dig
来获取信息?
当然,您可以将表达式作为参数传递给 #dig
:
h.dig(:users, h.dig(:users)&.keys&.first, :name)
#=> John
如果您想要更易读,请提取密钥,但代价是代码行数:
first_user_id = h.dig(:users)&.keys&.first
h.dig(:users, first_user_id, :name)
#=> John
另一种选择是链接您的 #dig
方法调用。这更短,但不太清晰。
h.dig(:users)&.values&.dig(0, :name)
#=> John
恐怕没有"neater"既能安全导航又能做到这一点的方法。