Получить список всех ключей в массиве хэшей - PullRequest
0 голосов
/ 25 сентября 2018

Что у меня есть: массив хешей с разными размерами.

hashes = [{:a => 0}, {:a => 0, :b => 1}, {:a => 1, :c => 1}] 

Что мне нужно: мне нужен список всех ключей.РЕДАКТИРОВАТЬ: фактический список, а не хэш.

[:a, :b, :c]

Это правильный подход?Это кажется немного тяжелым.

hashes.flat_map(&:keys).uniq

Или какие-нибудь другие идеи?Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Ваш путь - это хороший баланс между производительностью и идиотизмом.Я попробовал несколько других подходов.

# with reduce
hashes.map(&:keys).reduce(:|)
# with merge
hashes.each_with_object({}) { |memo, h| memo.merge! h }.keys
# manually
set = {}
hashes.each { |h| h.each_key { |k| set[k] = nil } }
set.keys

время в секундах для объединения 1000 хешей с ~ 8 ключами на хеш 1000 раз

uniq   0.539034
reduce 2.194463
merge  0.090131
manual 0.911875

Для удобочитаемости ваш подход выигрывает.Снижение сосет.Руководство уродливо и медленно.

Я бы выбрал подход merge, поскольку он не очень уродлив и супер быстр.

0 голосов
/ 25 сентября 2018

Вы были довольно близко

hashes.flat_map(&:to_a).reverse.to_h
#=> {:c=>1, :a=>0, :b=>1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...