module TreeReject
Constants
- VERSION
Public Instance Methods
tree_reject(map, ignored_keys)
click to toggle source
returns a new map with the ignored keys removed ignored_keys must be an array of IKItems IKItem is the type <Symbol | Array<IkItem> | Hash<Symbol, IKItem>> keys are only removed if their path in the trees match
# File lib/tree_reject.rb, line 18 def tree_reject(map, ignored_keys) ignored_leaves = extract_leaves(ignored_keys) ignored_subtrees = extract_subtrees(ignored_keys, ignored_leaves) map.to_h.each_with_object({}) do |(k, v), cleaned| if ignored_leaves.include?(k) next elsif v.is_a?(Hash) || v.respond_to?(:attributes) cleaned_v = tree_reject(v.to_h, ignored_subtrees[k]) cleaned[k] = cleaned_v unless cleaned_v == {} elsif !v.nil? cleaned[k] = v end end end
Private Instance Methods
extract_leaves(ignored_keys)
click to toggle source
extract the top level leaves from the ignored_keys tree structure
# File lib/tree_reject.rb, line 37 def extract_leaves(ignored_keys) [ignored_keys].flatten.reject { |ignored_key| ignored_key.is_a?(Hash) } end
extract_subtrees(ignored_keys, ignored_leaves)
click to toggle source
extract the top level subtrees from the ignored_keys tree structure, skipping ones included ignored_leaves
# File lib/tree_reject.rb, line 42 def extract_subtrees(ignored_keys, ignored_leaves) [ignored_keys].flatten.select { |ignored_key| ignored_key.is_a?(Hash) }.inject({}) do |h, ignored_subtree| ignored_subtree.each_pair do |k, v| next if ignored_leaves.include?(k) if h.key?(k) h[k] << v else h[k] = [v] end end h end end