[英]How to convert an array to a hash with specified common values
我有一个数组: arr = [:a, :b, :c]
我想要一个散列,其中每个上述值都是一个键,其值为空散列: hsh = {a: {}, b: {}, c: {}}
做到这一点最简洁的方法是什么(是否存在性能折衷)?
这是我当前的解决方案:
arr.inject({}) do |hash, entry|
hash[entry] = {}
hash
end
您可以使用each_with_object
而不是inject
,以避免返回值:
arr.each_with_object({}) { |k, h| h[k] = {} }
#=> {:a=>{}, :b=>{}, :c=>{}}
在修订中隐藏了一个较短的方法,但是Cary不建议这样做;-)
有很多方法,例如:
arr.zip([{}] * arr.size).to_h
或(后者,thx @Stefan,可能不是您想要的,因为它将为所有键共享一个哈希):
arr.product([{}]).to_h
arr
则如果您尚未访问它们,那么最初可用的密钥也会被修改。 -每次要访问新键时,都在数组中进行线性搜索。
Hash.new { |hash, key| hash[key] = {} if arr.include? key }
我想到的几种技术
技术1
p Hash[arr.dup.fill{ |i| [arr[i], {}]}] # preserves original arr, works on copy (dup)
p Hash[arr.fill{ |i| [arr[i], {}]}] # mutates original arr
技术2
arr = [:a, :b, :c]
p Hash[arr.zip(Array.new(arr.length) { |i| i = {}})]
技术3-这是技术2的变体,使用Ruby 2.1中提供的to_h
方法
p [:a, :b, :c].instance_eval { self.zip(Array.new(self.length) {|i| i = {}})}.to_h
以上所有技术都会产生期望的输出
{:a=>{}, :b=>{}, :c=>{}}
each
一种方法:
hsh = {}
arr.each {|x| hsh[x] = {}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.