code: function mapValues (obj, fnOrProperty) {
    if (obj == null) {
      return obj
    }
    var fn = null
    if (fnOrProperty == null) {
      fn = identity
    } else if (fnOrProperty instanceof Function) {
      fn = fnOrProperty
    } else if (typeof fnOrProperty === 'string') {
      fn = function (v) { return v[fnOrProperty] }
    } else {
      throw new Error('fnOrProperty must either be undefined, a function or a string')
    }
  
    return Object.keys(obj).reduce(function (result, key) {
      result[key] = fn(obj[key], key)
      return result
    }, {})
  }
docs: Create a new object with a same keys and the function applied to each value.
  If fnOrProperty is a string, `v => v[fnOrProperty]` will be applied to each value
  If fnOrProperty is undefined, The identity-function will be used, which makes
  it for objects equivalent to _.clone
  @param obj
  @param fnOrProperty