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
, что может быть немного безопаснее, если вы обрабатываете данные из внешнего источника
Удаление элементов из хеша
Ваш второй вопрос немного сложнее.У вас есть два варианта:
- Удалить ключи
primary_role
из вложенных хэшей или - Создать новый объект, содержащий все данные, кроме ключей
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"
}
}
]