Управление выходом из массива вложенных хэшей в Ruby - PullRequest
0 голосов
/ 25 мая 2018

Я извлекаю данные из API в JSON и в настоящее время наталкиваюсь на проблему с ошибками

Данные представлены компаниями, такими как Google и Facebook, и находятся в массиве или хешах, например, так:

[
  {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>GOOG, "primary_role"=>"company"}},
  {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>FB, "primary_role"=>"company"}}
]

Ниже приведены две операции, которые я хотел бы попробовать:

  1. Для каждой компании выведите имя, идентификатор и символ акции (т. Е. "Google -1 - GOOG "и" Facebook - 2 - FB ")
  2. Удалить ключ / значение" основная роль "из Google и Facebook
  3. Назначить новый ключ / значение" промышленность "для Google и Facebook

Есть идеи?

Я новичок в Ruby, но сталкиваюсь с проблемами с некоторыми функциями / методами (например, неопределенным методом) для массивов и хэшей, так как это выглядит как массив OF хэшей

Спасибо!

1 Ответ

0 голосов
/ 25 мая 2018

Ruby предоставляет несколько инструментов, которые помогут нам понять массивы, хэши и вложенные сочетания обоих.

Предполагая, что ваши данные выглядят так (я добавил кавычки вокруг GOOG и FB):

data = [
  {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>"GOOG", "primary_role"=>"company"}},
  {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>"FB", "primary_role"=>"company"}}
]

Вы можете перебирать массив, используя each, например:

data.each do |result|
   puts result["id"]
end

Копать в хеш и печатать результат можно впара способов:

data.each do |result|
  # method 1
  puts result["properties"]["name"]

  # method 2  
  puts result.dig("properties", "name")
end

Метод # 1 использует синтаксис hash[key], и поскольку первое значение хеша является другим хешем, он может быть соединен в цепочку для получения результата, который выпосле.Недостаток этого подхода заключается в том, что если у вас отсутствует ключ properties в одном из ваших результатов, вы получите ошибку.

Метод № 2 использует dig, который принимаетвложенные ключи в качестве аргументов (по порядку).Он будет копаться во вложенных хэшах и извлечет значение, но если какой-либо шаг пропущен, он вернет nil, что может быть немного безопаснее, если вы обрабатываете данные из внешнего источника

Удаление элементов из хеша

Ваш второй вопрос немного сложнее.У вас есть два варианта:

  1. Удалить ключи primary_role из вложенных хэшей или
  2. Создать новый объект, содержащий все данные, кроме ключей primary_role.

Как правило, я предпочитаю последнее и рекомендую ознакомиться с неизменяемостью и неизменяемыми структурами данных.

Однако для достижения [1] вы можете сделать на месте delete ключа:

data.each do |company| 
  company["properties"].delete("primary_role")
end

Добавление элементов в хеш

Вы назначаете новые значения хеш-функции просто с помощью hash[key] = value, поэтомувы можете установить для отрасли что-то вроде:

data.each do |company| 
  company["properties"]["industry"] = "Advertising/Privacy Invasion"
end

, что даст вам что-то вроде:

[
  {
    "id"=>"1", 
    "properties"=>{
      "name"=>"Google", 
      "stock_symbol"=>"GOOG", 
      "industry"=>"Advertising/Privacy Invasion"
    }
  },
  {
    "id"=>"2", 
    "properties"=>{
      "name"=>"Facebook", 
      "stock_symbol"=>"FB", 
      "industry"=>"Advertising/Privacy Invasion"
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...