Class: Hash

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_extend/core/hash.rb

Instance Method Summary collapse

Instance Method Details

#common_basic(h = {}, other_hash) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/rails_extend/core/hash.rb', line 77

def common_basic(h = {}, other_hash)
  each do |key, value|
    v = Array(value) & Array(other_hash[key])
    if v.size > 1
      h[key] = v
    elsif v.size == 1
      h[key] = v[0]
    elsif v.empty?
      h.delete(key)
    end
  end
  h
end

#diff_add(other_hash) ⇒ Object

a = { a:1, b: 2 } a.diff_add { a: [1,2] } => adds: { b: 2 }



69
70
71
# File 'lib/rails_extend/core/hash.rb', line 69

def diff_add(other_hash)
  other_hash.diff_remove(self)
end

#diff_changes(other_hash) ⇒ Object



73
74
75
# File 'lib/rails_extend/core/hash.rb', line 73

def diff_changes(other_hash)
  [diff_remove(other_hash), diff_add(other_hash)]
end

#diff_remove(other_hash, diff = {}) ⇒ Object

a = { a:1, b: 2 } a.diff_remove { a: [1,2] } => removes: { b: 2 }



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rails_extend/core/hash.rb', line 50

def diff_remove(other_hash, diff = {})
  (keys | other_hash.keys).each do |key|
    if self[key] != other_hash[key]
      if self[key].is_a?(Hash) && other_hash[key].is_a?(Hash)
        diff[key] = self[key].diff_remove(other_hash[key])
      elsif self[key].is_a?(Array) && other_hash[key].is_a?(Array)
        diff[key] = self[key] - other_hash[key]
      elsif other_hash[key].is_a?(NilClass)
        diff[key] = self[key]
      end
    end
  end

  diff
end

#diff_toggle(remove = true, other_hash) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/rails_extend/core/hash.rb', line 33

def diff_toggle(remove = true, other_hash)
  removed = {}
  added = {}
  o = other_hash.extract!(*(self.keys & other_hash.keys))

  if remove
    removed.merge! o.common_basic(self)
  end
  added.merge! o.diff_remove(self)
  added.merge! other_hash

  [removed, added]
end

#leaves ⇒ Object

遍历出一个 hash 的根节点



92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/rails_extend/core/hash.rb', line 92

def leaves
  r = []

  values.each do |value|
    if value.is_a?(Hash)
      r += value.leaves
    else
      r << value
    end
  end

  r
end

#toggle(remove = true, other_hash) ⇒ Object



3
4
5
# File 'lib/rails_extend/core/hash.rb', line 3

def toggle(remove = true, other_hash)
  dup.toggle!(remove, other_hash)
end

#toggle!(remove = true, other_hash) ⇒ Object

a = 1 a.toggle! a: 2 => { a: [1, 2] } a.toggle! a: 3 => { a: [1, 2, 3] }



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rails_extend/core/hash.rb', line 12

def toggle!(remove = true, other_hash)
  common_keys = self.keys & other_hash.keys
  common_keys.each do |key|
    if remove
      removed = Array(self[key]) & Array(other_hash[key])
    else
      removed = []
    end
    added = Array(other_hash[key]) - Array(self[key])
    self[key] = Array(self[key]) - removed + added
    if self[key].empty?
      self.delete(key)
    elsif self[key].size == 1
      self[key] = self[key][0]
    end
  end
  other_hash.except! *common_keys
  self.merge! other_hash
  self
end