我有一个像string = "this_is_a_test"
这样的字符串和一个哈希hash
。如何将字符串转换为键路径,以便返回位于hash['this']['is']['a']['test']
的值?
我不想简单地将字符串拆分成数组;我想使用字符串作为密钥来访问哈希。密钥已经存在于哈希中。
答案 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('_');