&引用;要散列的数组";Ruby中的变换

&引用;要散列的数组";Ruby中的变换,ruby,arrays,hash,transform,Ruby,Arrays,Hash,Transform,我需要将[“a”,“b”,“c”,“d”]转换为{:a=>{:b=>{:c=>“d”}} 有什么想法吗 谢谢我喜欢它: class Array def to_weird_hash length == 1 ? first : { first.to_sym => last(length - 1).to_weird_hash } end end ["a", "b", "c", "d"].to_weird_hash 你觉得怎么样?我喜欢它: class Array def

我需要将
[“a”,“b”,“c”,“d”]
转换为
{:a=>{:b=>{:c=>“d”}}

有什么想法吗

谢谢

我喜欢它:

class Array
  def to_weird_hash
    length == 1 ? first : { first.to_sym => last(length - 1).to_weird_hash }
  end
end

["a", "b", "c", "d"].to_weird_hash
你觉得怎么样?

我喜欢它:

class Array
  def to_weird_hash
    length == 1 ? first : { first.to_sym => last(length - 1).to_weird_hash }
  end
end

["a", "b", "c", "d"].to_weird_hash
你觉得怎么样?

好笑

ruby-1.8.7-p174 > ["a", "b", "c", "d"].reverse.inject{|hash,item| {item.to_sym => hash}}
 => {:a=>{:b=>{:c=>"d"}}}
好笑


如果你只需要写4个元素,写出来很容易(而且可读性也很强)

否则,这将适用于可变长度数组

>> ["a", "b", "c", "d"].reverse.inject(){|a,e|{e.to_sym => a}}
=> {:a=>{:b=>{:c=>"d"}}}
>> ["a", "b", "c", "d", "e", "f"].reverse.inject(){|a,e|{e.to_sym => a}}
=> {:a=>{:b=>{:c=>{:d=>{:e=>"f"}}}}}

如果你只需要写4个元素,写出来很容易(而且可读性也很强)

否则,这将适用于可变长度数组

>> ["a", "b", "c", "d"].reverse.inject(){|a,e|{e.to_sym => a}}
=> {:a=>{:b=>{:c=>"d"}}}
>> ["a", "b", "c", "d", "e", "f"].reverse.inject(){|a,e|{e.to_sym => a}}
=> {:a=>{:b=>{:c=>{:d=>{:e=>"f"}}}}}

我在IRC的帮助下找到了答案

x = {}; a[0..-3].inject(x) { |h,k| h[k.to_sym] = {} }[a[-2].to_sym] = a[-1]; x
使用递归的第二种方法(更好)


我在IRC的帮助下找到了答案

x = {}; a[0..-3].inject(x) { |h,k| h[k.to_sym] = {} }[a[-2].to_sym] = a[-1]; x
使用递归的第二种方法(更好)


这对哪个版本的ruby有效?好的。在1.8.7和1.9.2中,我从中获得了未定义的方法
,我现在使用irb进行此操作,但在脚本/控制台中进行此操作之前,它不起作用。显然,方法数组#from不存在…:SSounds像是一个ROR Monkeypatch。这对什么版本的ruby有效?好的。在1.8.7和1.9.2中,我从
中获得了未定义的方法
,我现在使用irb进行此操作,但在脚本/控制台中进行此操作之前,它不起作用。显然,方法数组#from不存在…:S听起来像是一个ROR Monkeypatch。我需要它包含多个元素。@retro,不确定多个元素是什么意思。我添加了一种使用可变长度数组的方法,这意味着我在输入数组中有多个元素。这也是一个很好的解决方案。我需要一个以上的元素。@retro,不知道多个元素是什么意思。我添加了一种使用可变长度数组的方法,这意味着我在输入数组中有多个元素。这也是一个很好的解决方案。我会稍微小心一点:你怎么知道它应该被转换成
{:a=>{:b=>{:c=>“d”}
而不是
{:a=>:b,:c=>:d}
?我会稍微小心一点:你怎么知道它应该被转换成
{:a=>{:b=>{:c=>{:d}
而不是
{:a=:b,:c=>:d}/code>?