0

サービス間でデータを移動しようとしていますが、ハッシュと配列の両方を含む大きなレコードから繰り返し発生するハッシュを削除する必要があります。

レコードのすべてのセクションから削除するハッシュは

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

Heres の例のデータ:

   {"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 gem の使用を避けたいと考えています。


データ構造を詳しく見て、これを理解しました。削除する必要がある要素は常に配列内にあるため、再帰する前にハッシュ キー/値が存在するかどうかを確認し、存在する場合は削除します。これはもっとうまくコーディングできると確信しているので、あなたの考えを教えてください。

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

複雑な配列/ハッシュ データ構造内にあるものと同じハッシュを削除する方法を探している場合は、簡単です。

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 に答える