class Array
Public Instance Methods
reduce_to_hash(sym_or_hash = nil, &block)
click to toggle source
# File lib/reduce_to_hash.rb, line 2 def reduce_to_hash(sym_or_hash = nil, &block) raise ArgumentError.new('Either block or symbol(s) required') if block.nil? and sym_or_hash.nil? raise ArgumentError.new('Block and symbol(s) cannot be used together') unless block.nil? or sym_or_hash.nil? if block self.reduce({}) do |memo, item| mapped = block.call(item) if mapped.nil? memo else memo.merge(mapped) end end elsif sym_or_hash.respond_to? :keys raise ArgumentError.new('Mapping hash must have single k=>v pair') if sym_or_hash.keys.length != 1 key = sym_or_hash.keys.first val = sym_or_hash.values.first self.reduce({}) { |memo, item| memo.merge({rth_extract(item, key) => rth_extract(item, val)}) } else self.reduce({}) { |memo, item| memo.merge({rth_extract(item, sym_or_hash) => item}) } end end
Private Instance Methods
rth_extract(item, key)
click to toggle source
# File lib/reduce_to_hash.rb, line 31 def rth_extract(item, key) if item.is_a? Hash item[key] else item.send(key) end end