转换哈希值哈希值的数组

时间:2017-10-04 17:49:54

标签: arrays ruby hash

我有一系列哈希哈希。结构如下:

items = [{"Spaghetti & Meatballs"=>
   {
    :menu_item_name=>"Spaghetti & Meatballs",
    :quantity=>192,
    :category=>"delicious"}},
 {"Bananas"=>
   {
    :menu_item_name=>"Bananas",
    :quantity=>187,
    :category=>"sweet"}}]

我想做以下事情:

items["Bananas"] 

并在香蕉上返回哈希。

2 个答案:

答案 0 :(得分:1)

使用:

items = [{"Spaghetti & Meatballs"=>
   {
    :menu_item_name=>"Spaghetti & Meatballs",
    :quantity=>192,
    :category=>"delicious"}},
 {"Bananas"=>
   {
    :menu_item_name=>"Bananas",
    :quantity=>187,
    :category=>"sweet"}}]     

尝试:

items.find{|hsh| hsh.keys.first == "Bananas"}

在控制台中:

2.3.1 :011 > items.find{|hsh| hsh.keys.first == "Bananas"}
 => {"Bananas"=>{:menu_item_name=>"Bananas", :quantity=>187, :category=>"sweet"}} 

如果需要,可以将其分配给变量:

bananas_hsh = items.find{|hsh| hsh.keys.first == "Bananas"}

再次,在控制台中:

2.3.1 :012 > bananas_hsh = items.find{|hsh| hsh.keys.first == "Bananas"}
 => {"Bananas"=>{:menu_item_name=>"Bananas", :quantity=>187, :category=>"sweet"}} 
2.3.1 :013 > bananas_hsh
 => {"Bananas"=>{:menu_item_name=>"Bananas", :quantity=>187, :category=>"sweet"}} 

答案 1 :(得分:1)

您希望items["Banana"]返回items的{​​{1}}元素数组(哈希值),这些元素具有键#34; Bananas"。让我们考虑如何做到这一点。

items.class #=> Array开始,我们必须定义一个实例方法Array#[]来执行此操作。但是有一个问题:Array已经有了实例方法Array#[],它的用法如下:[1,2,3][1] #=> 2,其中参数是数组的索引,其值为被退回

条件是哈希的键不是数字,我们可以执行以下操作。

class Array
  alias :left_right_paren :[]
  def [](x)
    if x.is_a?(Integer)
      left_right_paren(x)
    else
      find { |h| h.keys.include?(x) }
    end
  end
end

[1,2,3][1]
   #=> 2
items["Bananas"]
   #=> {"Bananas"=>{:menu_item_name=>"Bananas", :quantity=>187, :category=>"sweet"}}

剩下的就是决定这是不是一个好主意。我的看法?议员!!