【问题标题】:Converting an Array of hashes of hashes Ruby转换哈希的哈希数组 Ruby
【发布时间】:2019-04-03 01:21:33
【问题描述】:

我有一个哈希数组。这是结构的样子:

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

我想做以下事情:

items["Bananas"] 

并返回香蕉的哈希值。

【问题讨论】:

  • 你不需要数组,你可以有items = { "Bananas" => { menu_item_name: "Bananas", quantity: 187 }, "Spaghetti" => { menu_item_name: "Spaghetti", quantity: 192 } }
  • 这就是我的数据发送给我的方式,它在一个数组中。我无法改变这一点。
  • @SebastianPalma,为什么这个问题是重复的?这个问题不是如何从哈希数组中获取特定的哈希(链接问题的主题);这是如何让items["Bananas"] 做到这一点。 (我刚刚投票决定重新开放,然后它又重新开放了。我不知道我拥有魔法尘埃。)

标签: arrays ruby hash


【解决方案1】:

您希望items["Banana"] 返回具有键“香蕉”的items 的元素(哈希)数组。让我们考虑一下如何做到这一点。

因为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"}}

剩下的就是决定这是否是一个好主意。我的意见?呸!!

【讨论】:

    【解决方案2】:

    与:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2017-07-06
      • 2019-10-27
      • 2019-05-23
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多