как я могу перебирать этот массив хэшей, чтобы получить определенное значение: RUBY - PullRequest
0 голосов
/ 07 мая 2020

ха sh У меня есть следующее:

aoh=[
  { "name": "Vesper",
    "glass": "martini",
    "category": "Before Dinner Cocktail",
    "ingredients": [
      { "unit": "cl",
        "amount": 6,
        "ingredient": "Gin" },
      { "unit": "cl",
        "amount": 1.5,
        "ingredient": "Vodka" },
      { "unit": "cl",
        "amount": 0.75,
        "ingredient": "Lillet Blonde" }
    ],
    "garnish": "Lemon twist",
    "preparation": "Shake and strain into a chilled cocktail glass." },
  { "name": "Bacardi",
    "glass": "martini",
    "category": "Before Dinner Cocktail",
    "ingredients": [
      { "unit": "cl",
        "amount": 4.5,
        "ingredient": "White rum",
        "label": "Bacardi White Rum" },
      { "unit": "cl",
        "amount": 2,
        "ingredient": "Lime juice" },
      { "unit": "cl",
        "amount": 1,
        "ingredient": "Syrup",
        "label": "Grenadine" }
    ],
    "preparation": "Shake with ice cubes. Strain into chilled cocktail glass." }]

Как я могу повторить это, чтобы получить ТОЛЬКО ингредиент (без возврата имени, бокала, категории и т. Д. c.)? Мне также нужна такая же итерация для количества, но я предполагаю, что она будет выглядеть так же, как итерация для ингредиента. Извините за глупый вопрос, я новичок в ruby и пытаюсь это сделать уже несколько часов.

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

В вашем примере есть массив из двух элементов. Эти два элемента представляют собой хеши с парами ключ / значение. Вы можете l oop через массив с помощью метода #each и получить доступ к значениям, которые хранятся в ключах :"ingredients" следующим образом:

aoh.each do |hash|
  hash[:ingredients]
end

Каждый из ключей :ingredients хранит другой массив хешей. Пример ha sh:

{ "unit": "cl",
        "amount": 6,
        "ingredient": "Gin" }

Затем вы можете получить доступ к значению под ключом :ingredient, выполнив hash[:ingredient]. Окончательный результат выглядит примерно так:

   aoh.each do |array_element|
    array_element[:ingredients].each do |ingredient|
      ingredient[:ingredient]
    end
  end

В настоящее время выполняется только итерация по массивам и хешам. Если вы хотите распечатать результат, вы можете сделать это:

  aoh.each do |array_element|
    array_element[:ingredients].each do |ingredient|
      puts ingredient[:ingredient]
    end
  end
#=> Gin
#   Vodka
#   Lillet Blonde
#   White rum
#   Lime juice
#   Syrup

Если вы хотите получить модифицированный массив, вы можете использовать #map (или #flat_map). Вы также можете получить сумму со следующим значением:

   aoh.flat_map do |array_element|
    array_element[:ingredients].map do |ingredient|
      [[ingredient[:ingredient], ingredient[:amount]]
    end
  end
#=> [["Gin", 6], ["Vodka", 1.5], ["Lillet Blonde", 0.75], ["White rum", 4.5], ["Lime juice", 2], ["Syrup", 1]]
0 голосов
/ 08 мая 2020

Я бы предложил следующее.

aoh=[
     { "name": "Vesper",
       "ingredients": [
         { "unit": "cl", "ingredient": "Gin" },
         { "unit": "cl", "ingredient": "Vodka" }
       ],
       "garnish": "Lemon twist"
     },
     { "name": "Bacardi",
       "ingredients": [
         { "unit": "cl", "ingredient": "White rum" },
         { "unit": "cl", "ingredient": "Lime juice" }
       ],
     }
   ]

aoh.each_with_object({}) { |g,h| h[g[:name]] =
  g[:ingredients].map { |f| f[:ingredient] } }
  #=> {"Vesper"=>["Gin", "Vodka"], "Bacardi"=>["White rum", "Lime juice"]} 
0 голосов
/ 07 мая 2020
>aoh.collect { |i| i[:ingredients].collect { |g| puts g[:ingredient] } }
   Gin
   Vodka
   Lillet Blonde
   White rum
   Lime juice
   Syrup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...