Class: Hash
- Inherits:
-
Object
- Object
- Hash
- Defined in:
- lib/rails_extend/core/hash.rb
Instance Method Summary collapse
- #common_basic(h = {}, other_hash) ⇒ Object
-
#diff_add(other_hash) ⇒ Object
a = { a:1, b: 2 } a.diff_add { a: [1,2] } => adds: { b: 2 }.
- #diff_changes(other_hash) ⇒ Object
-
#diff_remove(other_hash, diff = {}) ⇒ Object
a = { a:1, b: 2 } a.diff_remove { a: [1,2] } => removes: { b: 2 }.
- #diff_toggle(remove = true, other_hash) ⇒ Object
-
#leaves ⇒ Object
遍历出一个 hash 的根节点.
- #toggle(remove = true, other_hash) ⇒ Object
-
#toggle!(remove = true, other_hash) ⇒ Object
a = 1 a.toggle! a: 2 => { a: [1, 2] } a.toggle! a: 3 => { a: [1, 2, 3] }.
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 |