Вы можете сделать это рекурсивно, чтобы справиться с вложенными вхождениями passthrough_fields
, независимо от того, найдены они в массиве или под хэше. Встроенные комментарии, чтобы объяснить вещи немного, как это идет:
hash = JSON.parse(input) # convert the JSON to a hash
def remove_recursively(hash, *to_remove)
hash.each do |key, val|
hash.except!(*to_remove) # the heavy lifting: remove all keys that match `to_remove`
remove_recursively(val, *to_remove) if val.is_a? Hash # if a nested hash, run this method on it
if val.is_a? Array # if a nested array, loop through this checking for hashes to run this method on
val.each { |el| remove_recursively(el, *to_remove) if el.is_a? Hash }
end
end
end
remove_recursively(hash, 'passthrough_fields')
Для демонстрации на упрощенном примере:
hash = {
"test" => { "passthrough_fields" => [1, 2, 3], "wow" => '123' },
"passthrough_fields" => [4, 5, 6],
"array_values" => [{ "to_stay" => "I am", "passthrough_fields" => [7, 8, 9]}]
}
remove_recursively(hash, 'passthrough_fields')
#=> {"test"=>{"wow"=>"123"}, "array_values"=>[{"to_stay"=>"I am"}]}
remove_recursively(hash, 'passthrough_fields', 'wow', 'to_stay')
#=> {"test"=>{}, "array_values"=>[{}]}
Это займется любыми массивами и будет искать вложенные хэши, сколь бы глубокими они ни были.
Требуется любое количество полей для удаления, в данном случае одного 'passthrough_fields'
.
Надеюсь, это поможет, дайте мне знать, как вы поживаете.