Ruby: преобразование Ha sh -Клавиши - PullRequest
2 голосов
/ 06 февраля 2020

У меня есть Ха sh:

urls = [{'logs' => 'foo'},{'notifications' => 'bar'}]

Цель состоит в том, чтобы добавить префикс к клавишам:

urls = [{'example.com/logs' => 'foo'},{'example.com/notifications' => 'bar'}]

Моя попытка:

urls.map {|e| e.keys.map { |k| "example.com#{k}" }}

Затем я получаю массив с желаемой формой ключей, но как я могу манипулировать оригинальным ха sh?

Ответы [ 3 ]

6 голосов
/ 06 февраля 2020

Если вы хотите «вручную» преобразовать ключи, то вы можете сначала выполнить итерацию по вашему массиву хэшей, а затем по каждому объекту (каждый ха sh) отобразить их значение в га sh, где ключ интерполируется с "example.com/", и значение остается неизменным:

urls.flat_map { |hash| hash.map { |key, value| { "example.com/#{key}" => value } } }
# [{"example.com/logs"=>"foo"}, {"example.com/notifications"=>"bar"}]

Обратите внимание, что URL-адреса "плоско сопоставлены", в противном случае вы получите массивы массивов, содержащие хэш / es.

Если вы предпочитаете упростить это, вы можете использовать встроенный метод для преобразования ключей в га sh, который имеет Ruby; Hash#transform_keys:

urls.map { |url| url.transform_keys { |key| "example.com/#{key}" } }
# [{"example.com/logs"=>"foo"}, {"example.com/notifications"=>"bar"}]
3 голосов
/ 06 февраля 2020

Использование transform_keys.

urls = [{'logs' => 'foo'}, {'notifications' => 'bar'}]
urls.map { |hash| hash.transform_keys { |key| "example.com/#{key}" } }
# => [{"example.com/logs"=>"foo"}, {"example.com/notifications"=>"bar"}]

Один вопрос: вам лучше всего использовать массив хэшей, или лучше подойдет один ha sh? Например:

urls = { 'logs' => 'foo', 'notifications' => 'bar' }

Кажется немного более разумным способ хранения данных. Затем, сказав, что вам все еще нужно преобразовать эти данные:

urls.transform_keys { |key| "example.com/#{key}" }
# => {"example.com/logs"=>"foo", "example.com/notifications"=>"bar"}

Или перейти из исходного массива к выводу ha sh:

urls = [{'logs' => 'foo'}, {'notifications' => 'bar'}]
urls.reduce({}, &:merge).transform_keys { |key| "example.com/#{key}" }

# => {"example.com/logs"=>"foo", "example.com/notifications"=>"bar"}

Намного проще работать с IMHO :)

0 голосов
/ 06 февраля 2020

Если у вас нет доступа к Hash#transform_keys, т.е. Ruby <2.5.5, это должно работать: </p>

urls.map{ |h| a = h.to_a; { 'example.com/' + a[0][0] => a[0][1] } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...