2012-01-27 40 views
2
[[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

的阵列工作是数组如何使用哈希

我怎么能得到对应于特定值的值。

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

我想:

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

但它说:

cant convert String to Integer 

请提供一些指导

+0

最好的解决方案(恕我直言)是改变如何创建结构。你有能力做到这一点吗? – 2012-01-27 14:06:42

+0

是的马克我有能力做到这一点,你能指导我通过吗? – 2012-01-27 14:10:43

+0

嗅觉像一个正常的散列:'status = {“Postponed”=> 10,“Low”=> 3,“Medium”=> 4,“High”=> 5} – dgasper 2012-01-27 14:12:41

回答

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 

编辑:马克托马斯的答案是相当伟大的,一个d比注射更短,因为它做同样的事情。他在我回答之前写下了它。尼斯;)

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"]

+0

然后如何获得arr1中的键值? – 2012-01-27 14:08:04

+0

我意识到这一点。我想你会更好用散列(请参阅我的后续编辑)。我只提供了arr1,因为你最初需要一个数组。 – SimonMayer 2012-01-27 14:12:41

+0

thnx西蒙为您的快速反应! – 2012-01-27 18:09:54

1

访问它在一般情况下, ,哈希将不是唯一的,所以您需要过滤而不是通过索引选择一个。例如,假设你有这样的:

现在让我们假设你想获得对应于任何散列与:coconut键的值。然后,只需使用:

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

给出答案列表。在这种情况下,只有一个匹配键,所以数组中只有一个条目。如果还有其他的哈希值是有一个:在有椰子键,那么你就会有这样的:

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

就整体而言,虽然,这是一个非常不寻常的数据结构有。如果你控制结构,那么你应该考虑使用可以按照你喜欢的方式返回合理答案的对象,而不是哈希。

+0

好吧,thnx很多@John ..它的工作。你也可以告诉我如何改变结构。在你的例子中说,我想将arr转换为这样的[{:apple =>'abc'},{:banana =>'def'}] ..我的意思是正常散列而不是散列阵列 – 2012-01-27 14:13:09

+0

你的榜样仍然是一组哈希值。 (原始结构是散列数组。)您可以通过'arr.flatten'获得刚刚描述的内容。 – 2012-01-27 14:39:47

0

你可以简单地调用#flatten原来阵列上。那会给你一些散列。我认为你真的想要的只是一个散列。

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

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

+0

thnx Thanatos !! – 2012-01-27 18:09:25

9

如何做一个散列出来的高效支持?

arr.flatten.reduce(:merge) 

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

thnx马克,你的答案是有用的:) – 2012-01-27 18:08:39