【问题标题】:Turning an array into a hash将数组转换为哈希
【发布时间】:2020-01-26 15:27:54
【问题描述】:

我有一个 ruby​​ 哈希数组:

my_array = [{"apples" => 5}, {"oranges" => 12}]

我想把它变成一个哈希,其中哈希键等于数组索引值+1,所以像这样:

my_hash = {"1"=>{"apples"=> 5}, "2"=>{"oranges" => 12}}

有什么想法吗?

【问题讨论】:

  • my_array.each_with_index.map{|elem, idx| [idx + 1, elem]}.to_h
  • @SergioTulentsev to_s 会在你的情况下做同样的伎俩:)
  • @LukasBaliak:字符串键开头可能是个错误:)

标签: arrays ruby


【解决方案1】:

你也可以Enumerable#zip带一个范围,然后转换Array#to_h

(1..my_array.size).zip(my_array).to_h
#=> {1=>{"apples"=>5}, 2=>{"oranges"=>12}}

工作原理

my_array.size #=> 2 将数组的大小作为整数返回。

(1..my_array.size) 它是一个包容性的Range,它从1 枚举整数 到数组大小,在这种情况下为2

一个 Range 响应 Enumerable#zip,因此,例如,您可以这样做获得一个对数组:

(1..3).zip(:a..:c) #=> [[1, :a], [2, :b], [3, :c]]

最后可以将pair的Array转换成Hash,见Array#to_h

[[1, :a], [2, :b], [3, :c]].to_h #=> {1=>:a, 2=>:b, 3=>:c}

由于 Range 是由整数组成的,因此 Hash 的键是整数。但是您可以调整代码行以获取字符串作为键。

【讨论】:

  • 请您解释一下这个解决方案。我正在尝试查看是否可以修改它以生成一个哈希键,它是一个字符串,而不是一个整数,就像这里的情况
  • @EastsideDeveloper,我编辑了一个解释,希望清楚。我没有添加将密钥作为字符串获取的解决方案,但是如果您需要建议,请回帖。
【解决方案2】:

您可以尝试使用Enumerator#with_index 拥有索引和Enumerator#each_with_object 来创建新的哈希

my_array = [{"apples"=> 5}, {"oranges" => 12}]
my_hash = my_array.each.with_index.with_object({}){|(hsh, i), e| e[(i+1).to_s] = hsh}
# => {"1"=>{"apples"=> 5}, "2"=>{"oranges" => 12}}

【讨论】:

  • 也可以试试my_array.each.with_index.with_object 以获得更多的一致性
【解决方案3】:
my_array = [{"apples" => 5}, {"oranges" => 12}]
my_hash = my_array.each_with_index.map{|h, i| [(i+1).to_s,  h]}.to_h

【讨论】:

  • 你来不及了!
猜你喜欢
  • 2019-10-27
  • 2019-05-23
  • 2012-10-29
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多