Class: Hash
Instance Method Summary collapse
-
#each_key! ⇒ Object
Calls block once for each key in hsh, passing the key as a parameter, and updating it in place.
-
#each_pair! ⇒ Object
Calls block once for each key in hsh, passing the key and value as parameters, and updated them in place.
-
#each_sort ⇒ Object
Calls block once for each key in hsh, passing the key and value to the block as a two-element array.
-
#each_value! ⇒ Object
Calls block once for each key in hsh, passing the value as a parameter, and updating it in place.
-
#map_pair ⇒ Object
Calls block once for each key-value pair in hsh, passing the key and value as paramters to the block.
-
#pivot(direction = 'keys', &b) ⇒ Object
Hash#pivot aggregates values for a hash of hashes, for example to calculate subtotals and groups.
-
#size? ⇒ Boolean
Return true if size > 0.
-
#to_yaml_sort(opts = {}) ⇒ Object
Hash#to_yaml with sort .
Instance Method Details
#each_key! ⇒ Object
Calls block once for each key in hsh, passing the key as a parameter, and updating it in place.
Example
h = { "a" => "b", "c" => "d" }
h.each_key! {|key| key.upcase }
h => { "A" => "b", "C" => "d" }
Return self.
32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/webget_ramp/hash.rb', line 32 def each_key! each_pair{|key,value| key2=yield(key) if key===key2 #nop else self.delete(key) self[key2]=value end } end |
#each_pair! ⇒ Object
Calls block once for each key in hsh, passing the key and value as parameters, and updated them in place.
Example
h = { "a" => "b", "c" => "d" }
h.each_pair! {|key,value| key.upcase, value.upcase }
h => { "A" => "B", "C" => "D" }
Return self.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/webget_ramp/hash.rb', line 56 def each_pair! each_pair{|key,value| key2,value2=yield(key,value) if key===key2 if value===value2 #nop else self[key]=value2 end else self.delete(key) self[key2]=value2 end } return self end |
#each_sort ⇒ Object
Calls block once for each key in hsh, passing the key and value to the block as a two-element array.
The keys are sorted.
16 17 18 |
# File 'lib/webget_ramp/hash.rb', line 16 def each_sort keys.sort.each{|key| yield key,self[key] } end |
#each_value! ⇒ Object
Calls block once for each key in hsh, passing the value as a parameter, and updating it in place.
Example
h = { "a" => "b", "c" => "d" }
h.each_value! {|value| value.upcase }
h => { "a" => "B", "c" => "d" }
Return self.
85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/webget_ramp/hash.rb', line 85 def each_value! each_pair{|key,value| value2=yield(value) if value===value2 #nop else self[key]=yield(value) end } return self end |
#map_pair ⇒ Object
Calls block once for each key-value pair in hsh, passing the key and value as paramters to the block.
Example
h = {"a"=>"b", "c"=>"d", "e"=>"f" }
h.map_pair{|key,value| key+value }
=> ["ab","cd","ef"]
106 107 108 |
# File 'lib/webget_ramp/hash.rb', line 106 def map_pair keys.map{|key| yield key, self[key] } end |
#pivot(direction = 'keys', &b) ⇒ Object
Hash#pivot aggregates values for a hash of hashes, for example to calculate subtotals and groups.
Example:
h={
"a"=>{"x"=>1,"y"=>2,"z"=>3},
"b"=>{"x"=>4,"y"=>5,"z"=>6},
"c"=>{"x"=>7,"y"=>8,"z"=>9},
}
h.pivot(:keys) => {"a"=>[1,2,3],"b"=>[4,5,6],"c"=>[7,8,9]}
h.pivot(:vals) => {"x"=>[1,4,7],"y"=>[2,5,8],"z"=>[3,6,9]}
Calculating subtotals
The pivot method is especially useful for calculating subtotals.
Example
r = h.pivot(:keys)
r['a'].sum => 6
r['b'].sum => 15
r['c'].sum => 24
Example
r=h.pivot(:vals)
r['x'].sum => 12
r['y'].sum => 15
r['z'].sum => 18
Block customization
You can provide a block that will be called for the pivot items.
Examples
h.pivot(:keys){|items| items.max } => {"a"=>3,"b"=>6,"c"=>9}
h.pivot(:keys){|items| items.join("/") } => {"a"=>"1/2/3","b"=>"4/5/6","c"=>"7/8/9"}
h.pivot(:keys){|items| items.inject{|sum,x| sum+=x } } => {"a"=>6,"b"=>15,"c"=>24}
Examples
h.pivot(:vals){|items| items.max } => {"a"=>7,"b"=>8,"c"=>9}
h.pivot(:vals){|items| items.join("-") } => {"a"=>"1-4-7","b"=>"2-5-8","c"=>"3-6-9"}
h.pivot(:vals){|items| items.inject{|sum,x| sum+=x } } => {"a"=>12,"b"=>15,"c"=>18}
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/webget_ramp/hash.rb', line 168 def pivot(direction='keys',&b) a=self.class.new direction=direction.to_s up=pivot_direction_up?(direction) each_pair{|k1,v1| v1.each_pair{|k2,v2| k = up ? k1 : k2 a[k]=[] if (a[k]==nil or a[k]=={}) a[k]<<(v2) } } if block_given? a.each_pair{|k,v| a[k]=(yield v)} end a end |
#size? ⇒ Boolean
Return true if size > 0
7 8 9 |
# File 'lib/webget_ramp/hash.rb', line 7 def size? size>0 end |
#to_yaml_sort(opts = {}) ⇒ Object
Hash#to_yaml with sort
115 116 117 118 119 120 121 122 123 |
# File 'lib/webget_ramp/hash.rb', line 115 def to_yaml_sort( opts = {} ) YAML::quick_emit( object_id, opts ) do |out| out.map( taguri, to_yaml_style ) do |map| sort.each do |k, v| # <-- here's my addition (the 'sort') map.add( k, v ) end end end end |