在散列数组的散列中符号化和替换散列值中的值
symbolizing and replacing a value in hash values in hash of array of hash
我有一个类似于此的数据结构
lib_data = {'library'=>[{"type"=>"Books",
"checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s",
"name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s",
"value"=>"%s"}}]}]}
我试图先对所有键进行符号化,然后在由 %s 代替表示的键中插入值
我能够将一小段代码猴子修补到哈希 class 中,这将使我能够使用类似这样的东西来符号化所有哈希值
def symbolize_all_keys
keys.each do |k|
key = k.to_sym
value = delete(k)
store(key, value)
end
self
end
然后只需使用 lib_data.symbolize_all_keys
但这象征着一把钥匙
是否有更惯用的方式来符号化所有键?
还想要一种将值插入到具有 %s 个值的键中的方法吗?
如果您使用的是rails,您可以使用HashWithIndifferentAccess
您还可以在 Rails 之外访问此 class,需要核心扩展:
require "active_support/core_ext/hash/indifferent_access"
2.6.5 :015 > lib_data = {'library'=>[{"type"=>"Books",
2.6.5 :016 > "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s",
2.6.5 :017 > "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s",
2.6.5 :018 > "value"=>"%s"}}]}]}
=> {"library"=>[{"type"=>"Books", "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s", "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s", "value"=>"%s"}}]}]}
2.6.5 :019 > lib_data[:library]
=> nil
2.6.5 :020 > lib_data = lib_data.with_indifferent_access
=> {"library"=>[{"type"=>"Books", "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s", "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s", "value"=>"%s"}}]}]}
2.6.5 :021 > lib_data[:library]
=> [{"type"=>"Books", "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s", "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s", "value"=>"%s"}}]}]
您可以以递归方式使用 Hash#transform_keys!,例如:
def symbolize_all_keys(h)
if h.is_a? Hash
h.transform_keys!(&:to_sym)
h.values.each do |val|
val.each { |v| symbolize_all_keys(v) } if val.is_a? Array
symbolize_all_keys(val)
end
end
h
end
symbolize_all_keys(lib_data)
lib_data
#=> {:library=>[{:type=>"Books", :checkout=>false, :data=>[{:type=>"Books", :operator=>"AND", :details=>{:property=>"Name", :author=>"%s", :name=>"%s"}}, {:type=>"Books", :criteria=>{:property=>"Revision", :operator=>"%s", :value=>"%s"}}]}]}
对于第二部分,不清楚哪个值正在替换“%s”,具体取决于密钥。
只是一个想法,类似于上面的递归:
def replace_val(h, new_val = 'new_val')
if h.is_a? Hash
h.each do |key, val|
h[key] = new_val if val == '%s'
val.each { |v| replace_val(v) } if val.is_a? Array
replace_val(val)
end
end
h
end
replace_val(lib_data)
lib_data
#=> {:library=>[{:type=>"Books", :checkout=>false, :data=>[{:type=>"Books", :operator=>"AND", :details=>{:property=>"Name", :author=>"new_val", :name=>"new_val"}}, {:type=>"Books", :criteria=>{:property=>"Revision", :operator=>"new_val", :value=>"new_val"}}]}]}
在这里您可以访问值的键,但不能访问更高级别。
我有一个类似于此的数据结构
lib_data = {'library'=>[{"type"=>"Books",
"checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s",
"name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s",
"value"=>"%s"}}]}]}
我试图先对所有键进行符号化,然后在由 %s 代替表示的键中插入值
我能够将一小段代码猴子修补到哈希 class 中,这将使我能够使用类似这样的东西来符号化所有哈希值
def symbolize_all_keys
keys.each do |k|
key = k.to_sym
value = delete(k)
store(key, value)
end
self
end
然后只需使用 lib_data.symbolize_all_keys
但这象征着一把钥匙
是否有更惯用的方式来符号化所有键?
还想要一种将值插入到具有 %s 个值的键中的方法吗?
如果您使用的是rails,您可以使用HashWithIndifferentAccess
您还可以在 Rails 之外访问此 class,需要核心扩展:
require "active_support/core_ext/hash/indifferent_access"
2.6.5 :015 > lib_data = {'library'=>[{"type"=>"Books",
2.6.5 :016 > "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s",
2.6.5 :017 > "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s",
2.6.5 :018 > "value"=>"%s"}}]}]}
=> {"library"=>[{"type"=>"Books", "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s", "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s", "value"=>"%s"}}]}]}
2.6.5 :019 > lib_data[:library]
=> nil
2.6.5 :020 > lib_data = lib_data.with_indifferent_access
=> {"library"=>[{"type"=>"Books", "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s", "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s", "value"=>"%s"}}]}]}
2.6.5 :021 > lib_data[:library]
=> [{"type"=>"Books", "checkout"=>false, "data"=>[{"type"=>"Books", "operator"=>"AND", "details"=>{"property"=>"Name", "author"=>"%s", "name"=>"%s"}}, {"type"=>"Books", "criteria"=>{"property"=>"Revision", "operator"=>"%s", "value"=>"%s"}}]}]
您可以以递归方式使用 Hash#transform_keys!,例如:
def symbolize_all_keys(h)
if h.is_a? Hash
h.transform_keys!(&:to_sym)
h.values.each do |val|
val.each { |v| symbolize_all_keys(v) } if val.is_a? Array
symbolize_all_keys(val)
end
end
h
end
symbolize_all_keys(lib_data)
lib_data
#=> {:library=>[{:type=>"Books", :checkout=>false, :data=>[{:type=>"Books", :operator=>"AND", :details=>{:property=>"Name", :author=>"%s", :name=>"%s"}}, {:type=>"Books", :criteria=>{:property=>"Revision", :operator=>"%s", :value=>"%s"}}]}]}
对于第二部分,不清楚哪个值正在替换“%s”,具体取决于密钥。
只是一个想法,类似于上面的递归:
def replace_val(h, new_val = 'new_val')
if h.is_a? Hash
h.each do |key, val|
h[key] = new_val if val == '%s'
val.each { |v| replace_val(v) } if val.is_a? Array
replace_val(val)
end
end
h
end
replace_val(lib_data)
lib_data
#=> {:library=>[{:type=>"Books", :checkout=>false, :data=>[{:type=>"Books", :operator=>"AND", :details=>{:property=>"Name", :author=>"new_val", :name=>"new_val"}}, {:type=>"Books", :criteria=>{:property=>"Revision", :operator=>"new_val", :value=>"new_val"}}]}]}
在这里您可以访问值的键,但不能访问更高级别。