如何访问数组数组深处的元素而不获取“未定义方法”错误

发布于 2024-11-15 09:00:58 字数 259 浏览 5 评论 0原文

当尝试访问数组数组深处的元素时,如果元素不存在,避免出现错误“undefined method `[]” for nil:NilClass”的最佳方法是什么?

例如,我目前正在这样做,但对我来说似乎很糟糕:

if @foursquare['response']['groups'][0].present? && @foursquare['response']['groups'][0]['items'].present?

When trying to access an element deep in an array of arrays, what is the best way to avoid getting the error 'undefined method `[]' for nil:NilClass' if an element doesn't exist?

For example I'm currently doing this, but it seems bad to me:

if @foursquare['response']['groups'][0].present? && @foursquare['response']['groups'][0]['items'].present?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

顾挽 2024-11-22 09:00:58

Ruby 2.3.0 引入了一种名为 dig 的新方法 上的 HashArray 可以与新的安全导航运算符 (&.) 结合使用来解决您的问题。

@foursquare.dig('response', 'groups')&.first&.dig('items')

如果任何级别缺少值,这将返回nil

Ruby 2.3.0 introduced a new method called dig on both Hash and Array that can be combined with the new safe navigation operator (&.) to solve your problem.

@foursquare.dig('response', 'groups')&.first&.dig('items')

This will return nil if a value is missing at any level.

厌倦 2024-11-22 09:00:58

根据您的数组内容,您可以省略 .present?。 Ruby 也只会采用此类构造中的最后一个值,因此您可以省略 if 语句。

@foursquare['response']['groups'][0] &&
@foursquare['response']['groups'][0]['items'] &&
@foursquare['response']['groups'][0]['items'][42]

对于这个问题,更优雅的解决方案是 egonil (博客文章),andand gem (博客文章),甚至 Ruby 2.3 的 安全导航操作符

更新:最近的Ruby包含#dig方法,在这种情况下可能会有所帮助。有关更多详细信息,请参阅 user513951 的回答。

Depending on your array content, you can omit the .present?. Ruby will also just take the last value in such a construct, so you can omit the if statement.

@foursquare['response']['groups'][0] &&
@foursquare['response']['groups'][0]['items'] &&
@foursquare['response']['groups'][0]['items'][42]

More elegant solutions for this problem are the egonil (blog post), the andand gem (blog post), or even Ruby 2.3's safe navigation operator.

Update: Recent Rubies include the #dig method, which might be helpful in this case. See user513951's answer for more details.

懵少女 2024-11-22 09:00:58
if @foursquare['response']['groups'][0].to_a['items']
  . . .

碰巧 NilClass 实现了一个返回 [] 的 #to_a 这意味着您可以将每个 nil 映射到[] 并且通常编写单个表达式而不进行测试。

if @foursquare['response']['groups'][0].to_a['items']
  . . .

It happens that NilClass implements a #to_a that returns []. This means that you can map every nil to [] and typically write a single expression without tests.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文