Лучший способ преобразовать ключи хеша в массив, только если их значения установлены в true - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь найти элегантный и компактный способ преобразования ключей хеша в массив, который содержит только те из них, которые имеют значение true

example = {"foo" => true, "bar" => false, "baz" => true}

становится

example = ["foo", "baz"]

Ответы [ 4 ]

0 голосов
/ 05 мая 2018

Есть много разных способов сделать это. Вот еще один:

example.reduce([]) { |memo, (k, v)| v ? memo << k : memo }

Или, аналогично:

example.each_with_object([]) { |(k, v), memo| memo << k if v }

Или вы можете использовать мой ореховый кусочно драгоценный камень:

example.piecewise { |yielder, (k, v)| yielder << k if v }
0 голосов
/ 05 мая 2018

Самый короткий будет example.select{|k, v| v}

для извлечения ключей просто добавьте .keys

РЕДАКТИРОВАТЬ: если, как Кэри предлагает, будут иные, чем булевы значения, вы должны будете проверить v == true или v.eql? true

0 голосов
/ 05 мая 2018

Мои 2 цента:

example.collect{|k, v| k if v}.compact

вывод: ["foo", "baz"]

Который может работать и при выборе false:

example.collect{|k, v| k if !v}.compact

вывод: ["bar"]

.. или

0 голосов
/ 05 мая 2018
example = example.keys.select {|key| example[key].eql? true}

p example

выход

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