我正在尝试找到一种优雅而紧凑的方法,将哈希键转换为仅包含具有 true 作为值的数组
example = {"foo" => true, "bar" => false, "baz" => true}
成为
example = ["foo", "baz"]
example = example.keys.select {|key| example[key].eql? true}
p example
输出
["foo", "baz"]
最短的将是example.select{|k, v| v}
要提取密钥,只需添加.keys
编辑:如果像Cary建议除了布尔值之外还有其他值,则必须检查v == true
或v.eql? true
我的 2 美分:
example.collect{|k, v| k if v}.compact
输出:["foo", "baz"]
这也可以选择假:
example.collect{|k, v| k if !v}.compact
输出:["bar"]
..或
有很多不同的方法可以做到这一点。这是另一个:
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 }