2013-09-26 28 views
0

我正试图在服务之间移动数据,并且需要从包含哈希和数组的大型记录中删除重复散列。Ruby:删除大型嵌套数据结构中的重复散列

哈希从记录的每个部分删除是

{ 
     "description": "simple identifier", 
     "name": "id", 
     "type": "id" 
    }, 

继承人示例数据:

{"stuff": { "defs": [ 
     { 
      "description": "simple identifiery", 
      "name": "id", 
      "type": "id" 
     }, 
     { 
      "name": "aDate", 
      "type": "date" 
     }, 
     { 
      "defs": [ 
       { 
        "description": "simple identifier", 
        "name": "id", 
        "type": "id" 
       }, 
       { 
        "case-sensitive": true, 
        "length": null, 
        "name": "Id", 
        "type": "string" 
       }, 
       { 
        "name": "anotherDate", 
        "type": "dateTime" 
       } 
      ], 
     }, 
     { 
      "defs": [ 
       { 
        "description": "simple identifier", 
        "name": "id", 
        "type": "id" 
       }, 

...其它更多....

我创建了几个递归函数删除元素,但我留下了一个空的哈希'{}'。我也尝试删除父项,但发现我删除了散列父项,而不是散列本身。

我敢肯定,我可以创建一个新的散列并填充我想要的数据,但必须有一种方法来做到这一点。

我不在铁轨工作,并希望避免使用铁轨宝石。


我通过仔细观察数据结构来了解这一点。需要删除的元素总是在数组中,因此在递归之前检查散列键/值是否存在,如果是,则删除。我确信这可以更好地编码,让我知道你的想法。

def recursive_delete!(node, key, value) 
    if node.is_a?(Array)                             
    node.delete_if { |elm| elm[key] == value } 
    node.each do |elm| 
     recursive_delete!(elm, key, value) 
    end 
    elsif node.is_a?(Hash) 
    node.each_value do |v| 
     recursive_delete!(v, key, value) 
    end 
    end 
end 
+1

如果你发布了你写的代码 – lmars

+0

你会删除给定散列的*所有匹配项*,或除第一个匹配项以外的所有匹配* *?它会一直是哈希中的数组的一部分?数据结构是否有任何限制? – lurker

回答

0

如果您正在寻找删除相同的散列,你有复杂的阵列/散列数据结构内的方式,很容易:

def remove_hash_from(source, hsh) 
    return unless source.is_a?(Hash) || source.is_a?(Array) 

    source.each do |*args| 
    if args.last == hsh 
     source.delete(args.first) 
    elsif args.last.is_a?(Hash) || args.last.is_a?(Array) 
     remove_hash_from(args.last, hsh) 
    end 
    end 

    source 
end 

data = [ 
    {h: 'v', 
    j: [{h: 'v'}, 
     {a: 'c'}, 
     8, 
     'asdf'] 
    }, 
    asdf: {h: 'v', j: 'c'} 
] 

remove_hash_from(data, {h: 'v'}) 
# => [{:h=>"v", :j=>[{:a=>"c"}, 8, "asdf"]}, {:asdf=>{:h=>"v", :j=>"c"}}] 

可能的话,你将需要调整上述的方法您的需求。但我希望通用的想法是明确的。