Рубиновый массив в хеш - PullRequest
       3

Рубиновый массив в хеш

1 голос
/ 16 октября 2019

Как в Ruby конвертировать массив в хеш? У меня есть такой массив

people = [
  {"name":"Sam","year":"21"},
  {"name":"cole","partition":"20"},
  {"name":"bart","year":"21"}
]

Я хочу поместить этот массив в хеш, как показано ниже, чтобы я мог проверить, кто 21:

{
  person1 => {"name"=>"Sam","year"=>"21"},
  person2 => {"name"=>"cole","partition"=>"20"},
  person3 => {"name"=>"bart","year"=>"21"}
}

Как я могу преобразовать этот массивиз хеша? И как я могу проверить, кто 21?

Ответы [ 2 ]

4 голосов
/ 16 октября 2019

Вы можете использовать each_with_object, чтобы перебрать "peaple" и назначить новому хешу текущий элемент, используя в качестве ключа префикс person плюс индекс текущего элемента (person).

peaple
  .each_with_object({})
  .with_index(1) do |(person, hash), index|
    hash["person#{index}"] = person
  end

# {"person1"=>{:name=>"Sam", :year=>"21"},
#  "person2"=>{:name=>"cole", :partition=>"20"},
#  "person3"=>{:name=>"bart", :year=>"21"}}

Другой любопытной версией было бы создание массива строк с одинаковой длиной "peaple", имеющего в качестве значений префикс "person" плюс его индекс плюс 1. Zipс текущим значением и вызовом to_h дает тот же результат:

Array.new(peaple.length) { |i| "person#{i + 1}" }.zip(peaple).to_h

Если идея состоит в том, кто получает 21 с помощью клавиши «год», то вы можете выбрать эти элементы с помощьюгод 21 и отображение затем их имена:

peaple
  .select { |person| person[:year] == "21" }
  .map { |person| person[:name] }
# ["Sam", "bart"]
1 голос
/ 16 октября 2019

Прежде всего, это пишется "люди";)

Так как ключи person1, person2 и т. Д. Должны быть сгенерированы, я бы перебрал ваш исходный массив, поместивкаждый элемент в новый хеш с соответствующим ключом:

people_hash = {}

people.each_with_index do |person, index|
    next unless person[:year] == 21 # This will skip any element that doesn't have an :age of 21

    people_hash["person#{index + 1}"] = person
end

people_hash
#=> {"person1"=>{:name=>"Sam", :year=>"21"}, "person2"=>{:name=>"cole", :partition=>"20"}, "person3"=>{:name=>"bart", :year=>"21"}}

Метод each_with_index будет циклически проходить через каждый элемент массива, но также будет предоставлять текущий индекс элемента, чтобы мы могли использоватьэто для хеш-ключей. Я использовал интерполяцию строк для создания ключей хеша - поскольку вы хотели начать с 1, я каждый раз добавлял 1 к индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...