Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 递归地修改嵌套哈希中的值_Ruby On Rails_Ruby_Recursion_Hash - Fatal编程技术网

Ruby on rails 递归地修改嵌套哈希中的值

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

给定以下哈希结构,我希望遍历该结构,并使用键“link”修改所有值:

我一直在使用的方法对我来说有点错误,因为我检查所有的值,看看它们是否有一个模式匹配应该是URL的内容,然后在那一点上修改它:

  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”
改为if
k?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