Ruby 仅当哈希键的值设置为true时,才将其转换为数组的最佳方法

Ruby 仅当哈希键的值设置为true时,才将其转换为数组的最佳方法,ruby,Ruby,我试图找到一种优雅而紧凑的方法,将散列键转换为只包含那些具有true as值的数组 example = {"foo" => true, "bar" => false, "baz" => true} 变成 example = ["foo", "baz"] 输出 ["foo", "baz"] 最短的是示例。选择{k,v} 要提取密钥,只需添加.keys 编辑:如果像Cary建议的那样,除了布尔值之外,还需要检查v==true或v.eql?真的我的2美分: example.co

我试图找到一种优雅而紧凑的方法,将散列键转换为只包含那些具有true as值的数组

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

example = ["foo", "baz"]
输出

["foo", "baz"]

最短的是
示例。选择{k,v}

要提取密钥,只需添加
.keys

编辑:如果像Cary建议的那样,除了布尔值之外,还需要检查
v==true
v.eql?真的

我的2美分:

example.collect{|k, v| k if v}.compact
输出:
[“foo”,“baz”]

这也适用于选择false:

example.collect{|k, v| k if !v}.compact
输出:
[“条”]


…或

有很多不同的方法可以做到这一点。这里还有一个:

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

example.reduce([]){{| memo,(k,v){v?memo啊!惊人的方式!这返回一个散列,OP需要一个键数组。您是对的,有点太快了,修改了答案,thnx关于
{a'=>1}
?srr Cary,我不明白它可以缩短为
example.keys.select{{key}example[key]}
事实上,我认为您最初的回答是正确的(抱歉)因为OP对某个值是否为真不感兴趣,而对它是否为
true
对象不感兴趣。@Sagar Pandya是的,我可以看到,它被还原了。@Cary Swoveland在他的问题中很明显,他想将同一个示例变量更改为数组。Rajagopalan,我将我的评论移到了这个问题上,我最初打算放在那里。谢谢“我正试图找到一种优雅而紧凑的方法,将散列键转换成只包含那些具有*true*值的数组。”我不认为有任何答案(到目前为止)已满足您的规范。部分原因可能是您的示例。您希望将
example
的值从散列转换为数组。在我看来,这不是一个好做法。对于包含值
true
的键的变量,我建议使用类似
true\u keys
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 }