Ruby 仅当哈希键的值设置为true时,才将其转换为数组的最佳方法
我试图找到一种优雅而紧凑的方法,将散列键转换为只包含那些具有true as值的数组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
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 }