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



我正在尝试找到一种优雅而紧凑的方法,将哈希键转换为仅包含具有 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 == truev.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 }

最新更新