我所拥有的:一系列大小不同的哈希。
hashes = [{:a => 0}, {:a => 0, :b => 1}, {:a => 1, :c => 1}]
我需要什么:我需要所有钥匙的清单。编辑:实际列表,而不是哈希。
[:a, :b, :c]
这是正确的方法吗?感觉有点沉重。
hashes.flat_map(&:keys).uniq
还有其他想法吗?谢谢!
答案 0 :(得分:2)
你很近
hashes.flat_map(&:to_a).reverse.to_h
#=> {:c=>1, :a=>0, :b=>1}
答案 1 :(得分:2)
您的方法是在表现和惯用之间取得良好的平衡。我尝试了其他一些方法。
# with reduce
hashes.map(&:keys).reduce(:|)
# with merge
hashes.each_with_object({}) { |memo, h| memo.merge! h }.keys
# manually
set = {}
hashes.each { |h| h.each_key { |k| set[k] = nil } }
set.keys
将1000个散列与每个哈希中的〜8个键合并1000次的时间(以秒为单位)
uniq 0.539034
reduce 2.194463
merge 0.090131
manual 0.911875
出于可读性考虑,您的方法将获胜。减少吮吸。手动和都很慢。
我会使用merge
方法,因为它不是很丑陋,而且速度很快。