繁体   English   中英

如何将数组转换为具有指定公共值的哈希

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM