Ruby on rails 递归地修改嵌套哈希中的值
给定以下哈希结构,我希望遍历该结构,并使用键“link”修改所有值: 我一直在使用的方法对我来说有点错误,因为我检查所有的值,看看它们是否有一个模式匹配应该是URL的内容,然后在那一点上修改它:Ruby on rails 递归地修改嵌套哈希中的值,ruby-on-rails,ruby,recursion,hash,Ruby On Rails,Ruby,Recursion,Hash,给定以下哈希结构,我希望遍历该结构,并使用键“link”修改所有值: 我一直在使用的方法对我来说有点错误,因为我检查所有的值,看看它们是否有一个模式匹配应该是URL的内容,然后在那一点上修改它: def find_all_values_for(key) result = [] result << self[key] self.values.each do |hash_value| if hash_value.to_s =~ URI::regex
def find_all_values_for(key)
result = []
result << self[key]
self.values.each do |hash_value|
if hash_value.to_s =~ URI::regexp # if the value looks like a URL then change it
# update the url
end
end
end
def find_all_value_for(键)
结果=[]
结果也许是这样的
def update_links(hash)
hash.each do |k, v|
if k == "link" && v.is_a?(String)
# update link here
v.replace "a modification"
elsif v.is_a?(Hash)
update_links v
elsif v.is_a?(Array)
v.flatten.each { |x| update_links(x) if x.is_a?(Hash) }
end
end
hash
end
我不明白你的问题。你到底想做什么?我已经更新了问题的细节,希望能有所帮助。如果你能编辑为:1)给你的哈希起个名字(例如,hash={…}
),这样读者可以在他们的答案中引用它;2) 缩短并简化散列,使之达到问题所需的最小值(术语无需与您的申请相关);3) 将散列重新格式化为不需要水平滚动即可读取(通过将其放在多行上);4) 显示给定散列的所需输出;5)清楚地陈述你的问题。好的,但是如果有一个数字数组,它会被打破。考虑<代码>案例V;当串;如果k==“链接”…结束;当散列。。。当数组。。。结束
。该示例不包含数组,但您可能希望修改答案以包含该可能性。关于@BroiSatse的评论,我想你可以把if k==“link”
改为ifk?String&&k==“link”
@CarySwoveland修复了多维数组问题。至于k,它是a吗?String&&k==“link”
,我相信k是a?字符串是多余的。啊,是的。很好地使用了flatten
。我把它藏起来了。
def update_links(hash)
hash.each do |k, v|
if k == "link" && v.is_a?(String)
# update link here
v.replace "a modification"
elsif v.is_a?(Hash)
update_links v
elsif v.is_a?(Array)
v.flatten.each { |x| update_links(x) if x.is_a?(Hash) }
end
end
hash
end