0

我正在尝试在服务之间移动数据,并且需要从包含散列和数组的大记录中删除重复出现的散列。

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

    {
        "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"
                },

……还有很多……

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

我很确定我可以创建一个新的哈希并用我想要的数据填充它,但必须有办法做到这一点。

我不在 Rails 中工作,我想避免使用 rails gems。


我通过更仔细地查看数据结构发现了这一点。需要删除的元素总是在一个数组中,所以在递归之前检查哈希键/值是否存在,如果存在则删除。我相信这可以更好地编码,所以让我知道你的想法。

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
4

1 回答 1

0

如果您正在寻找删除与复杂 Array/Hash 数据结构中相同的哈希的方法,这很容易:

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"}}]

可能,您需要根据需要调整上述方法。但我希望,共同的想法很清楚。

于 2013-09-27T02:10:16.010 回答