Конвертировать хеш хеш в массив хеш - PullRequest
0 голосов
/ 23 июня 2019

Мне нужно изменить хэш хэша и преобразовать его в хэш массива.

Мне также нужно добавить новое значение ключа.

Это мой текущий хеш:

{ "132552" => {
           "name" => "Paul",
           "id" => 53
         },
"22478" => {
          "name" => "Peter",
           "id" => 55
        }
}

Я ожидаю, что результат будет таким:

[
  {
      "person_id": "132552",
      "name" => "Paul",
      "id" => 53
   },
   {
      "person_id": "22478",
      "name" => "Peter",
      "id" => 55
   }
]

Ответы [ 3 ]

2 голосов
/ 23 июня 2019

Вы можете сопоставить с Enumerable # map с хэш-значениями, объединяющими ( Hash # merge ) новые пары:

original_hash.map { |k,v| v.merge({ "person_id" => k }) }
#=> [{"name"=>"Paul", "id"=>53, "person_id"=>"132552"}, {"name"=>"Peter", "id"=>55, "person_id"=>"22478"}]
0 голосов
/ 23 июня 2019

Это идеально подходит для Enumerable#each_with_object.

output = input.each_with_object([]) do |(person_id, values), array|
  array << values.merge("person_id" => person_id)
end

Этот метод принимает произвольный объект для нашего начального состояния (здесь - массив), итерация коллекции (наш хеш) с помощью блока. Начальный объект - yield как второй аргумент блока. На каждой итерации мы заполняем массив так, как хотим. В конце блока этот объект возвращается, в моем примере в переменной output.

Обратите внимание, что в моем примере я разбил хеш на (person_id, values): каждая запись хеша может быть разрушена как (key, values) в аргументах блока / метода.

перечислимых # each_with_object

0 голосов
/ 23 июня 2019

Возможно, не лучшее решение, но должно работать следующее (учитывая, что h - ваш хэш):

@h.each do |key,value|
  value["person_id"] = key
end

@array = []

@h.each do |key, value|
  @array << value
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...