首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽视零?

忽视零?
EN

Stack Overflow用户
提问于 2014-03-17 16:41:36
回答 3查看 645关注 0票数 4

我正试图解析一组json属性,并将它们分配给一个散列。json有很多层次:

代码语言:javascript
复制
player[:position]=player["positions"]["primary_position"]["position"]["name"]

我遇到的问题是,这些级别中的任何一个都可能为零,这意味着我需要编写四个单独的零?检查只是为了提取值。

我不关心nil值--如果数组只是将它们记录为" "或类似的东西,那就好了。

有什么方法可以关闭这种特殊类型的nil错误吗?还是应该通过一个rescue方法运行整个过程,该方法在发生nil时返回我想要的值

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-17 16:44:42

代码语言:javascript
复制
player[:position]=player["positions"]["primary_position"]["position"]["name"] rescue " "

这将返回所需的值,如果某物为零,则返回“”。

票数 1
EN

Stack Overflow用户

发布于 2014-03-17 16:45:21

您可以使用 gem,它类似于也许是单曲

代码语言:javascript
复制
player[:position] = player.andand["positions"].andand["primary_position"].andand["position"].andand["name"]

这是一个被保护的方法调用。只有当结果不是nil时,它才会继续向对象发送方法,否则会返回nil。这样,链式调用在其中一个返回nil时就停止了。

票数 4
EN

Stack Overflow用户

发布于 2014-03-17 17:26:32

通常的方法是这样使用inject

代码语言:javascript
复制
path  = %w[positions primary_position position name]
value = path.inject(player) { |h, k| h && h[k] }

您将调整h && h[k]测试以满足您的特定需求,假设您不必担心h中的非Hash值。你把它做得像你需要的那样精细。

如果您一直在做这样的事情,甚至可以将其修补到Hash中:

代码语言:javascript
复制
class Hash
  def follow_path(*path)
    # You could also path.flatten if you're not expecting Array keys
    path.inject(self) { |h, k| h && h[k] }
  end
end

value = person.follow_path(*%w[positions primary_position position name])

或者将其抛到私有实用程序方法中:

代码语言:javascript
复制
private

  def follow_path(h, *path)
    # Assuming you're not using Array keys...
    path.flatten.inject(h) { |h, k| h && h[k] }
  end

然后:

代码语言:javascript
复制
value = follow_path(person, %w[positions primary_position position name])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22460181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档