将字符串转换为散列中的键路径

时间:2015-11-18 23:21:37

标签: ruby

我有一个像string = "this_is_a_test"这样的字符串和一个哈希hash。如何将字符串转换为键路径,以便返回位于hash['this']['is']['a']['test']的值?

我不想简单地将字符串拆分成数组;我想使用字符串作为密钥来访问哈希。密钥已经存在于哈希中。

3 个答案:

答案 0 :(得分:5)

Inject在这里很好用:

hash = "this_is_a_test".split('_').reverse.inject("final value") { |h, s|  {s => h}  }

返回:

 {"this"=>{"is"=>{"a"=>{"test"=>"final value"}}}}

 hash['this']['is']['a']['test']
 => "final value"

这里的解释是,每次注入迭代都会返回一个哈希值,该哈希值包含当前字符串作为键,以及前一个哈希值作为值,因此每个新键都递归地包含到此为止的所有哈希值,包括最深的值这是作为注入的参数传递的。

这就是需要反转键数组的原因,因为哈希是从内到外创建的。

编辑:我认为我没有正确理解这个问题。

您实际上打算访问现有的递归哈希。

假设使用我之前的方法构建了哈希,那么也可以通过注入来访问最里面的值:

"this_is_a_test".split('_').inject(hash) { |h,v| h[v] }
=> "final value"

另请注意,Ruby 2.3以安全的方式实现了新的Hash#dig方法,该方法正是如此:

path = "this_is_a_test".split('_')
hash.dig(*path) # => "final value"

答案 1 :(得分:0)

可能是这样的吗?

    keys = ["a", "b", "c"]
    values = [1, 2, 3]
    zipped = keys.zip(values)
    => [["a", 1], ["b", 2], ["c", 3]]
    Hash[zipped]
    => {"a"=>1, "b"=>2, "c"=>3}

答案 2 :(得分:-1)

您正在寻找String.split()功能

var array = "this_is_a_test".split('_');