Arrays 如何使用嵌套数组从哈希中获取哈希键?

Arrays 如何使用嵌套数组从哈希中获取哈希键?,arrays,ruby,hash,Arrays,Ruby,Hash,在我的Ruby on Rails应用程序中,我有一个包含嵌套数组的哈希: COLORS = { :red => %w(draft open deactivated), :green => %w(sent downloaded paid activated) } 有没有一种方法可以提交一个数组值(如draft)来获取相应的哈希键 lookup_hash("draft") # => :red 感谢您的帮助。如果给定元素存在于多个数组中,该怎么办?如果这不是问题的

在我的Ruby on Rails应用程序中,我有一个包含嵌套数组的哈希:

COLORS = {
  :red    => %w(draft open deactivated),
  :green  => %w(sent downloaded paid activated)
}
有没有一种方法可以提交一个数组值(如draft)来获取相应的哈希键

lookup_hash("draft") # => :red

感谢您的帮助。

如果给定元素存在于多个数组中,该怎么办?如果这不是问题的话

def lookup_hash(item)
  COLORS.find { |k, v| v.include?(item) }&.first
end

如果给定元素存在于多个数组中怎么办?如果这不是问题的话

def lookup_hash(item)
  COLORS.find { |k, v| v.include?(item) }&.first
end

另一个想法是反转哈希以获得更清晰的代码:

STATUS_COLORS = {
  draft: :red,
  open: :red,
  deactivated: :red,
  sent: :green,
  downloaded: :green,
  paid: :green,
  activated: :green,
}

然后只需执行STATUS\u COLORS.fetchstatus.to\u sym。它更详细一点,但访问它的代码更可读一点。

另一个想法是反转哈希以获得更清晰的代码:

STATUS_COLORS = {
  draft: :red,
  open: :red,
  deactivated: :red,
  sent: :green,
  downloaded: :green,
  paid: :green,
  activated: :green,
}

然后只需执行STATUS\u COLORS.fetchstatus.to\u sym。它有点冗长,但是访问它的代码更可读。

谢谢。任何元素都不会出现两次。那就完美了!:在Ruby 2.4和安全导航:COLORS.find{k,v | break k if v.include?open}之前。如果要经常这样做,您可能需要反转查找表,使其结构类似于{draft=>:red,open=>:red,sent=>:green,}。因为需要一个键或nil,以下内容可能会更好理解,并避免使用安全导航操作符:COLORS.each_key.find{k | COLORS[k]。include?item}。谢谢。任何元素都不会出现两次。那就完美了!:在Ruby 2.4和安全导航:COLORS.find{k,v | break k if v.include?open}之前。如果要经常这样做,您可能需要反转查找表,使其结构类似于{draft=>:red,open=>:red,sent=>:green,}。因为需要一个键或nil,以下内容可以更好地阅读,避免使用安全导航操作符:COLORS.each_key.find{k | COLORS[k]。include?item}。当然,我们不知道颜色的结构是否需要用于与此问题无关的目的。还有,为什么这里的键是符号而不是字符串?除此之外,如果必须进行多次查找,则该概念将非常有用。也许只需要使用一个变量或实例变量:hinvert=COLORS.each_with_object{}{{k,v,h{v.each{s}h[s]=k}。然后就是hinvert[target]。我们没有,我只是根据问题中给出的上下文进行猜测。这主要是按照惯例的符号,但如果字符串更适合他们的应用,他们可以自由使用字符串。当然,我们不知道颜色的结构是否需要用于与这个问题无关的目的。还有,为什么这里的键是符号而不是字符串?除此之外,如果必须进行多次查找,则该概念将非常有用。也许只需要使用一个变量或实例变量:hinvert=COLORS.each_with_object{}{{k,v,h{v.each{s}h[s]=k}。然后就是hinvert[target]。我们没有,我只是根据问题中给出的上下文进行猜测。这主要是按照惯例使用的符号,但如果字符串更适合他们的应用程序,他们可以自由使用字符串。