[[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]]
是数组
如何获取与特定值对应的值。
说高回报5。 或者如何将这个哈希数组转换为数组,以便搜索变得容易。
我试过了:
find_all { |v| v['name'] == "Low" }
但它说:
cant convert String to Integer
请提供一些指导
答案 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}]
我会问,你在做什么来获得原始结构?可以改变吗?