【问题标题】:Extract Hash values using Hash#dig使用 Hash#dig 提取哈希值
【发布时间】:2016-04-09 16:04:46
【问题描述】:
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 来获取信息?

【问题讨论】:

  • 有没有办法计算这个数字?
  • 在使用Hash#dig时,您几乎必须事先知道密钥。

标签: ruby hash dig ruby-2.3


【解决方案1】:

当然,您可以将表达式作为参数传递给#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

恐怕没有“更整洁”的方式可以做到这一点,同时仍然可以安全导航。

【讨论】:

  • 为什么不只是h[:users].values.first[:name]
  • 如果h[:users] 没有响应#values,或者h[:users].values 没有响应#first,或者h[:users].values.first 没有响应#[],您的应用程序就会崩溃。你明白了。 :-) #dig 和安全导航(孤独)运算符都在 2.3 中实现以避免这种情况。
  • 合法,但丑陋的 af :)
猜你喜欢
  • 2016-04-09
  • 2019-10-31
  • 2013-06-29
  • 1970-01-01
  • 2020-11-28
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
相关资源
最近更新 更多