如何使用哈希数组

时间:2012-01-27 13:50:26

标签: ruby-on-rails ruby

[[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]]

是数组

如何获取与特定值对应的值。

说高回报5。 或者如何将这个哈希数组转换为数组,以便搜索变得容易。

我试过了:

find_all { |v| v['name'] == "Low" } 

但它说:

cant convert String to Integer  

请提供一些指导

5 个答案:

答案 0 :(得分:9)

如何使用单个哈希进行有效查询?

arr.flatten.reduce(:merge)

#=> {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5}

答案 1 :(得分:1)

在一般情况下,散列不是唯一的,因此您需要过滤而不是通过索引选择一个。例如,假设你有这个:

 arr = [[{:apple => 'abc'}], [{:banana => 'def'}], [{:coconut => 'ghi'}]]
 # => [[{:apple=>"abc"}], [{:banana=>"def"}], [{:coconut=>"ghi"}]]

现在让我们假设您希望获得与:coconut键的任何哈希对应的值。然后使用:

 arr.flatten.map { |h| h[:coconut] }.compact
 # => ["ghi"] 

这会为您提供答案列表。在这种情况下,只有一个匹配键,因此数组中只有一个条目。如果有其他哈希在那里有一个:椰子键,那么你会有类似的东西:

 # => ["ghi", "jkl", "mno"]

但总的来说,这是一个非常不寻常的数据结构。如果您控制结构,那么您应该考虑使用能够以您想要的方式返回合理答案的对象,而不是哈希。

答案 2 :(得分:1)

如果你有一些代码:

array = [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]]

然后把它变成红宝石哈希:

hash = array.inject({}) {|h, e| h.merge(e.first) }
# => {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5}

因此您可以轻松找到'低'值:

hash['Low']
# => 3
编辑:马克托马斯的答案相当不错,而且比注入更短,因为它做同样的事情。在我回答之前他写了这篇文章。很好;)

答案 3 :(得分:0)

这个怎么样?

  arr = [
    [{"Postponed"=>10}],
    [{"Low"=>3}], 
    [{"Medium"=>4}], 
    [{"High"=>5}]
  ]
  arr1 = []

  arr.each{|a|
    arr1.push(a[0])
  }

虽然我想知道你是否真的只想得到一个哈希,你会这样做:

  myHash = {}

  arr.each{|a|
    a[0].each{|b, c|
      myHash[b] = c
    }
  }

然后您可以像myHash["Postponed"]

一样访问它

答案 4 :(得分:0)

您只需在原始阵列上调用#flatten即可。这会给你一系列哈希。我认为你真正想要的只是一个哈希。

1.8.7 :006 > [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]].flatten
=> [{"Postponed"=>10}, {"Low"=>3}, {"Medium"=>4}, {"High"=>5}] 

我会问,你在做什么来获得原始结构?可以改变吗?