Ruby 来自字符串数组的哈希访问值
Ruby hash access value from string array
我有如下哈希:
hash = {"a": [{"c": "d", "e": "f"}] }
一般我们可以像hash["a"][0]["c"]
那样访问它。
但是,我有一个像这样的字符串:
string = "a[0]['c']"
(这可能会根据用户输入而改变)
是否有使用上述字符串值访问散列的简单方法?
你可以这样做:
hash = { 'a' => [{ 'c' => 'd', 'e' => 'f' }] }
string = "a[0]['c']"
def nested_access(object, string)
string.scan(/\w+/).inject(object) do |hash_or_array, i|
case hash_or_array
when Array then hash_or_array[i.to_i]
when Hash then hash_or_array[i] || hash_or_array[i.to_sym]
end
end
end
puts nested_access(hash, string) # => "d"
扫描输入字符串中的字母、下划线和数字。其他一切都被忽略:
puts nested_access(hash, "a/0/c") #=> "d"
puts nested_access(hash, "a 0 c") #=> "d"
puts nested_access(hash, "a;0;c") #=> "d"
不正确的访问值将 return 为零。
它也可以使用符号作为键:
hash = {a: [{c: "d", e: "f"}]}
puts nested_access(hash, "['a'][0]['c']")
它带来了对用户输入不太严格的优点,但它确实有不能识别带空格键的缺点。
假设用户输入数组索引的数字和散列键的单词:
keys = string.scan(/(\d+)|(\w+)/).map do |number, string|
number&.to_i || string.to_sym
end
hash.dig(*keys) # => "d"
您可以使用 gsub
将其他字符清理到数组中并使用该数组访问您的哈希值
hash = {"a": [{"c": "d", "e": "f"}] }
string = "a[0]['c']"
tmp = string.gsub(/[\[\]\']/, '').split('')
#=> ["a", "0", "c"]
hash[tmp[0].to_sym][tmp[1].to_i][tmp[2].to_sym]
#=> "d"
我有如下哈希:
hash = {"a": [{"c": "d", "e": "f"}] }
一般我们可以像hash["a"][0]["c"]
那样访问它。
但是,我有一个像这样的字符串:
string = "a[0]['c']"
(这可能会根据用户输入而改变)
是否有使用上述字符串值访问散列的简单方法?
你可以这样做:
hash = { 'a' => [{ 'c' => 'd', 'e' => 'f' }] }
string = "a[0]['c']"
def nested_access(object, string)
string.scan(/\w+/).inject(object) do |hash_or_array, i|
case hash_or_array
when Array then hash_or_array[i.to_i]
when Hash then hash_or_array[i] || hash_or_array[i.to_sym]
end
end
end
puts nested_access(hash, string) # => "d"
扫描输入字符串中的字母、下划线和数字。其他一切都被忽略:
puts nested_access(hash, "a/0/c") #=> "d"
puts nested_access(hash, "a 0 c") #=> "d"
puts nested_access(hash, "a;0;c") #=> "d"
不正确的访问值将 return 为零。
它也可以使用符号作为键:
hash = {a: [{c: "d", e: "f"}]}
puts nested_access(hash, "['a'][0]['c']")
它带来了对用户输入不太严格的优点,但它确实有不能识别带空格键的缺点。
假设用户输入数组索引的数字和散列键的单词:
keys = string.scan(/(\d+)|(\w+)/).map do |number, string|
number&.to_i || string.to_sym
end
hash.dig(*keys) # => "d"
您可以使用 gsub
将其他字符清理到数组中并使用该数组访问您的哈希值
hash = {"a": [{"c": "d", "e": "f"}] }
string = "a[0]['c']"
tmp = string.gsub(/[\[\]\']/, '').split('')
#=> ["a", "0", "c"]
hash[tmp[0].to_sym][tmp[1].to_i][tmp[2].to_sym]
#=> "d"