2014-11-05 112 views
3

考虑下面的哈希结构,我想走路的结构,并作出修改所有的值与“链接”的关键:递归修改嵌套的哈希值

{"page_id":"12345", "link_data":{"message":"test message", "link":"https://www.example.com", "caption":"https://www.example.com", "child_attachments":[{"link":"http://www.example.com", "name":"test", "description":"test", "picture":"https://fbcdn-creative-a.akamaihd.net/hads-ak-xap1/t45.1600-4/10736595_6021553533580_1924611765_n.png"}, {"link":"http://www.example.com", "name":"test", "description":"test", "picture":"https://fbcdn-creative-a.akamaihd.net/hads-ak-xaf1/t45.1600-4/10736681_6021625991180_305087686_n.png"}, {"link":"http://www.example.com", "name":"test", "description":"test 2", "picture":"https://fbcdn-creative-a.akamaihd.net/hads-ak-xfp1/t45.1600-4/10736569_6020761399780_1700219102_n.png"}]}} 

的做法,我一直在玩感觉有点不对劲我在那Im检查所有值,看他们是否有一个模式匹配应该是什么网址,然后在这一点上修改它:

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 

所以确切最终的转换结果应该与URL的修改相同。我真正想要做的是将跟踪参数添加到散列中的每个URL中。

我已经玩弄了将散列转换为字符串并对其执行一些字符串替换的想法,但是看起来这似乎不是这样做的最干净的方式。

干杯

+2

我不明白你的问题。你到底想要做什么? – Surya 2014-11-05 17:44:15

+0

我已经更新了一个更详细的问题,希望它有帮助。 – cgallagher 2014-11-05 17:47:43

+0

如果你想编辑以下内容会有帮助:1)给你的散列一个名字(例如'hash = {...}'),以便读者可以在他们的答案中引用它; 2)将散列缩短并简化为问题所需的最小值(这些条款不需要与您的应用程序相关); 3)重新格式化散列,不需要水平滚动来读取它(通过将其放在多行上); 4)显示给定散列的所需输出; 5)清楚地说明你的问题。 – 2014-11-05 17:54:42

回答

8

也许这样的事情?

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

不错,但是如果有一组数字,它会中断。 – BroiSatse 2014-11-05 17:49:59

+0

太棒了,谢谢! – cgallagher 2014-11-05 17:51:22

+0

考虑'情况v;当String;如果k ==“link”...结束;当哈希; ...当Array; ...结束。 – 2014-11-05 18:06:20